2009-06-26 18 views
4

私はDataRowオブジェクト用の汎用拡張メソッドを作成しました。このメソッドは引数をとりません。私は、MethodInfoを使ってReflectionを通してGenericメソッドを呼び出したいと思います。私はNormarlパブリックメソッドのためにこれを行うことができますが、何とか私はGeneric Extensionメソッドのリファレンスを得ることができません。オブジェクトに対する汎用拡張メソッドの呼び出し?

私はthis questionを読んでいます。だからsomehwatは私のクエリに関係していますが、そのような運はありません。

+0

私の知る限り理解し、拡張メソッドは、のDataRowクラスの一部ではありません。拡張メソッドを定義したクラスを見て、ExtensionMethodAttributeを探す必要があります。 – shahkalpesh

+0

ExtensionAttribute(ExtensionMethodAttributeではなく)です。申し訳ありません。 – shahkalpesh

+0

@shahkalpesh:Thnks、それを試してみましょう.. –

答えて

11

拡張メソッドはコンパイラのトリックです。拡張メソッドが定義されている静的クラスで静的メソッドを検索すると、それをうまく呼び出すことができます。

さて、あなたが持っているすべてのオブジェクトであり、あなたがSystem.Runtime.CompilerServices.ExtensionAttributeを持っている方法のためのアプリケーションドメイン内のすべての静的クラスを検索することにより、問題の拡張メソッドを見つけることができる特定拡張メソッドを見つけようとしている場合と、問題の特定のメソッド名とパラメータシーケンス。

2つの拡張クラスが同じ名前と署名を持つ拡張メソッドを定義すると、その方法は失敗します。アセンブリがアプリケーションドメインにロードされていない場合も失敗します。

単純なアプローチは、(あなたが一般的な方法を探していると仮定した場合)これです:

static class Extensions { 
    public static T Echo<T>(this T obj) { 
     return obj; 
    } 
} 

class Program { 

    static void Main(string[] args) { 

     Console.WriteLine("hello".Echo()); 

     var mi = typeof(Extensions).GetMethod("Echo"); 
     var generic = mi.MakeGenericMethod(typeof(string)); 
     Console.WriteLine(generic.Invoke(null, new object[] { "hello" })); 

     Console.ReadKey(); 
    } 
} 
+0

ExtensionMethodを定義し、実行時にExtensionMethodをホストするオブジェクトに対して呼び出すMethoInfo参照をクラスから取得する必要があるということですか? –

+0

静的メソッドなので、オブジェクトに対して呼び出さないため、オブジェクトはメソッドの最初のパラメータです。 –

+0

これは、参照を取得しようとすると例外をスローすることを意味します。 –

関連する問題