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

  • Dirty Loops

    Dirty Loops

    21 Mayıs 2007
  • Keith Anthe

    Keith Anthe

    26 NİSAN 2011
  • kimberly p

    kimberly p

    23 Ocak 2010