ParameterInfo是一个扩展方法参数?

时间:2012-11-10 00:21:26

标签: c# reflection extension-methods

我想知道是否可以确定方法中的参数是否是基于this object me的{​​{1}}类型的参数?我知道你可以ParameterInfoIsOut等等。

感谢。

3 个答案:

答案 0 :(得分:4)

在扩展的类中,您不会通过反射找到扩展方法。但是,如果您正在查看定义了扩展方法的静态类,您可以查看方法信息本身以告知这是一个扩展方法。由于编译器在扩展方法上添加了ExtensionMethod属性:

bool isExtension=methodInfo.IsDefined(typeof(ExtensionAttribute),true);

然后你知道第一个参数是“this”。

答案 1 :(得分:0)

这似乎有效;目前只适用于没有参数和单参数方法但/有点黑客:

using System;
using System.Reflection;
using System.Collections.Generic;

namespace StackOverflow.Demos
{
    class Program
    {
        public static void Main(string[] args) 
        {
            object o = new object();
            Console.WriteLine(ExtensionDetectorT<string,object>.IsExtensionMethod(o.ToString));
            Console.WriteLine(ExtensionDetectorT<string, object>.IsExtensionMethod(o.ToString2));
            Console.WriteLine(ExtensionDetectorT<bool, object>.IsExtensionMethod(o.Equals));
            Console.WriteLine(ExtensionDetectorT<bool, object>.IsExtensionMethod(o.Equals2));
            Console.WriteLine(ExtensionDetectorVoid<object>.IsExtensionMethod(o.DoNothing));
            Console.WriteLine(ExtensionDetectorVoid<int>.IsExtensionMethod(o.DoNothing2));
            Console.WriteLine("Done");
            Console.ReadKey();
        }
    }

    public static class ExtensionDetectorT<TReturn,TParam1>
    {
        public delegate TReturn ExtensionMethodDelegateT();
        public delegate TReturn ExtensionMethodDelegateT2(TParam1 ignoreMe);

        public static bool IsExtensionMethod(ExtensionMethodDelegateT emd)
        {
            return !(new List<MethodInfo>(emd.Target.GetType().GetMethods())).Exists(delegate(MethodInfo mi) { return mi.Name.Equals(emd.Method.Name); });
        }
        public static bool IsExtensionMethod(ExtensionMethodDelegateT2 emd)
        {
            return !(new List<MethodInfo>(emd.Target.GetType().GetMethods())).Exists(delegate(MethodInfo mi) { return mi.Name.Equals(emd.Method.Name); });
        }
    }
    public static class ExtensionDetectorVoid<TParam1>
    {
        public delegate void ExtensionMethodDelegateVoid();
        public delegate void ExtensionMethodDelegateVoid2(TParam1 ignoreMe);
        public static bool IsExtensionMethod(ExtensionMethodDelegateVoid emd)
        {
            return !(new List<MethodInfo>(emd.Target.GetType().GetMethods())).Exists(delegate(MethodInfo mi) { return mi.Name.Equals(emd.Method.Name); });
        }
        public static bool IsExtensionMethod(ExtensionMethodDelegateVoid2 emd)
        {
            return !(new List<MethodInfo>(emd.Target.GetType().GetMethods())).Exists(delegate(MethodInfo mi) { return mi.Name.Equals(emd.Method.Name); });
        }
    }

    public static class ObjectExtensions
    {
        public static string ToString2(this object o) { return o.ToString(); }
        public static bool Equals2(this object o, object o2) { return o.Equals(o2); }
        public static void DoNothing(this object o) { }
        public static void DoNothing2(this object o, int i) { i++; }
    }
}

答案 2 :(得分:0)

namespace System.Reflection
{
    public static class MethodInfoExtensions
    {
        public static bool IsExtensionMethod(this MethodInfo method)
        {
            return method.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false);
        }
    }
}

似乎无法找到一种方法来查看特定的ParameterInfo以查看它是否是this object me类型的参数,但这适用于整个方法,就我而言经过测试,似乎我可以假设第一个参数是this object me参数。