我想知道是否可以确定方法中的参数是否是基于this object me
的{{1}}类型的参数?我知道你可以ParameterInfo
和IsOut
等等。
感谢。
答案 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
参数。