SORU
18 Kasım 2008, Salı


Uzatma Yöntemleri Belirlemek için yansıma

C# bir tekniği yansıma eğer bir yöntemi bir uzantı yöntemi olarak bir sınıf eklendi belirlemek için kullanan var mı?

Aşağıda gösterildiği gibi bir uzantısı yöntemi verilen Ters belirlemek mümkün değildir() string sınıfı eklendi?

public static class StringExtensions
{
    public static string Reverse(this string value)
    {
        char[] cArray = value.ToCharArray();
        Array.Reverse(cArray);
        return new string(cArray);
    }
}

Uzantısı yöntemi uygun şekilde geliştirici tarafından eklenen test birimi belirlemek için bir mekanizma arıyoruz. Bu girişim için bir nedeni de benzer bir yöntem geliştirici tarafından gerçek sınıf eklenmesi mümkün değildir, Eğer öyle olsaydı, derleyici bu yöntem alacak.

CEVAP
18 Kasım 2008, Salı


Uzantısı yöntemi tanımlanabilir nerede derlemeler bakmak gerekiyor.

Sınıflar ** 6, ve eden ve daha sonra bu sınıf içinde yöntemleri ile dekore arayınayrıcaExtensionAttribute ile dekore edilmiş. Kontrol edin eğer ilgileniyorsanız türüyle eşleşip eşleşmediğini görmek için ilk parametre yazın.

İşte tam kod. Daha titiz olabilir (bu tür iç içe olmayan, veya en az bir parametre olduğunu kontrol değil) ama size yardım etmek gerekir.

using System;
using System.Runtime.CompilerServices;
using System.Reflection;
using System.Linq;
using System.Collections.Generic;

public static class FirstExtensions
{
    public static void Foo(this string x) {}
    public static void Bar(string x) {} // Not an ext. method
    public static void Baz(this int x) {} // Not on string
}

public static class SecondExtensions
{
    public static void Quux(this string x) {}
}

public class Test
{
    static void Main()
    {
        Assembly thisAssembly = typeof(Test).Assembly;
        foreach (MethodInfo method in GetExtensionMethods(thisAssembly,
            typeof(string)))
        {
            Console.WriteLine(method);
        }
    }

    static IEnumerable<MethodInfo> GetExtensionMethods(Assembly assembly,
        Type extendedType)
    {
        var query = from type in assembly.GetTypes()
                    where type.IsSealed && !type.IsGenericType && !type.IsNested
                    from method in type.GetMethods(BindingFlags.Static
                        | BindingFlags.Public | BindingFlags.NonPublic)
                    where method.IsDefined(typeof(ExtensionAttribute), false)
                    where method.GetParameters()[0].ParameterType == extendedType
                    select method;
        return query;
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • infiniTuts

    infiniTuts

    18 Ocak 2012
  • kalabrandmusic

    kalabrandmus

    25 Kasım 2009
  • LevelUpTuts

    LevelUpTuts

    20 Ocak 2012