1

this object meメソッド内のパラメーターが、に基づいたパラメーターのタイプであるかどうかを判断できるかどうか疑問に思っていましたParameterInfo。私はあなたができることを知ってIsOutIsRefます

ありがとう。

4

3 に答える 3

4

拡張するクラスのリフレクションによる拡張メソッドは見つかりません。ただし、拡張メソッドが定義されている静的クラスを見ている場合は、メソッド情報自体を見て、それが拡張メソッドであることを確認できます。コンパイラは拡張メソッドに ExtensionMethod 属性を追加するため、次のようになります。

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

次に、最初のパラメーターが「this」になることがわかります。

于 2012-11-10T00:44:56.390 に答える
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パラメータ。

于 2012-11-10T01:02:16.140 に答える
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++; }
    }
}
于 2012-11-10T00:46:01.643 に答える