30

typeof指定した型の Type インスタンスを取得する場合は、C# キーワードを使用できます。MethodInfoしかし、参照によってメソッドを取得したい場合は、何を使用できますか?

たとえば、単純なコンソール アプリがあります。Program.Mainメソッドが含まれています。MethodInfoのようなものを使って取得したいmethodinfoof(Program.Main)。メソッド名が変更される可能性があるため、この問題が発生しているため、そのまま使用することはできませんType.GetMethodInfo(string MethodName)

取得したいメソッドが約 10,000 個あるためMethodInfo、メソッドにカスタム属性やその他のものを追加することは解決策ではありません。

4

7 に答える 7

23

以前に投稿された回答を少し変更しましたが、このブログ投稿はあなたが求めているものを達成しているようです。http://blog.functionalfun.net/2009/10/getting-methodinfo-of-generic-method.html

使用例は次のとおりです。

var methodInfo = SymbolExtensions.GetMethodInfo(() => Program.Main());

元々の答えはこの質問に対するものでした。https://stackoverflow.com/a/9132588/5827

于 2012-02-21T17:44:09.580 に答える
16

非静的メソッドには式ツリーを使用できます。ここに例があります。

using System.Linq.Expressions;
using System.Reflection;

public static class MethodInfoHelper
{
    public static MethodInfo GetMethodInfo<T>(Expression<Action<T>> expression)
    {
        var member = expression.Body as MethodCallExpression;

        if (member != null)
            return member.Method;

        throw new ArgumentException("Expression is not a method", "expression");
    }
}

次のように使用します。

        MethodInfo mi = MethodInfoHelper.GetMethodInfo<Program>(x => x.Test());
        Console.WriteLine(mi.Name);

Test() は、Program クラスで宣言されたメンバー関数です。

プロパティのゲッターとセッターをサポートする場合は、代わりにMemberExpressionandを使用します。MemberInfo

于 2012-02-21T17:48:57.363 に答える
11

テストクラス

public class  Foo
{
    public void DoFoo()
    {
        Trace.WriteLine("DoFoo");
    }

    public static void DoStaticFoo()
    {
        Trace.WriteLine("DoStaticFoo");
    }
}

そして、あなたはこのようなことをすることができます

MethodInfo GetMethodInfo(Action a)
{
    return a.Method;
}

var foo = new Foo();
MethodInfo mi = GetMethodInfo(foo.DoFoo);
MethodInfo miStatic = GetMethodInfo(Foo.DoStaticFoo);

//do whatever you need with method info

更新
@Greg コメントごとに、メソッドにいくつかのパラメーターがある場合は、、、、またはを使用できますが、不便Action<T>なのは、のオーバーロードを記述する必要があることです。Action<T1, T2>Action<T1, T2, T3>Func<T1>GetMethodInfo

于 2012-02-21T17:46:10.220 に答える
1

これを支援するために必要なヘルパー関数を作成する T4 テンプレートを作成しました。Func<> または Action<> メソッドから MethodInfo オブジェクトを取得する関数のリストを作成します。

次のコードを という名前のファイルにコピーしますGetMethodInfo.tt

<#@ template language="C#" #>
<#@ output extension=".cs" encoding="utf-8" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Text" #>
using System;
using System.Linq.Expressions;
using System.Reflection;

namespace Tools
{
    public static class GetMethodInfo
    {
<# int max = 12;
for(int i = 0; i <= max; i++) 
{
    var builder = new StringBuilder();

    for(int j = 0; j <= i; j++) 
    {
        builder.Append("T");
        builder.Append(j);
        if(j != i) 
        {
            builder.Append(", ");
        }
    }

    var T = builder.ToString();
#>
        public static MethodInfo ForFunc<T, <#= T #>>(Expression<Func<T, <#= T #>>> expression)
        {
            var member = expression.Body as MethodCallExpression;

            if (member != null)
                return member.Method;

            throw new ArgumentException("Expression is not a method", "expression");
        }

        public static MethodInfo ForAction<<#= T #>>(Expression<Action<<#= T #>>> expression)
        {
            var member = expression.Body as MethodCallExpression;

            if (member != null)
                return member.Method;

            throw new ArgumentException("Expression is not a method", "expression");
        }

<# } #>
    }
}

:

  • .tt テンプレートのBuild ActionがNoneに設定されていることを確認してください
  • max 変数を適切な設定に設定することで、作成する関数の数を増減できます。
于 2014-04-06T16:48:26.310 に答える