2

別の型の Func を引数に取るジェネリック型に拡張メソッドを実装する方法はありますか?

たとえば、次のような使用法があります。

myFirstObject.Extension<myOtherObject>( other => other.Prop );

または、より複雑な Func を使用します。

myFirstObject.Extension<myOtherObject>( other => other.Prop > 2 && other.Prop < 15 );

this oneのような関連する質問がいくつか見つかりましたが、私の場合、拡張メソッド内にもジェネリック型が必要です。

これが私が思いついたものです:

public static bool Extension<TSource, TIn, TKey>(this TSource p_Value, Expression<Func<TIn, TKey>> p_OutExpression) 
{ return true; }

しかし、いざ使おうとすると、2番目のタイプが考慮されていません。

何か不足していますか?

4

3 に答える 3

3

これを見てください:

s => s.Length;

コンパイラは、 が配列であるか、sプロパティstringを持つ他の型であるかをどのように判断するのでしょうか? 何らかの情報を提供しない限り、できません。sLength

(string s) => s.Length;

ああ、それでは行きます。だから今、これを試してください:

myFirstObject.Extension((myOtherObject o) => o.Prop > 2 && o.Prop < 15);

コンパイラに何を使用する必要があるかを伝えたので、それは機能し、式に基づいTInて何を使用するかを判断できます。TKey

于 2013-07-25T21:42:39.830 に答える
0

別の解決策は、型を引数に取る別のメソッドを作成することであることがわかりました。

例えば:

Void Extension(Type p_Type, [THE TYPE] p_Params)
{
    MethodInfo realExtensionMethod = typeof([CLASS CONTAINING THE METHOD]).GetMethod("RealExtension");
    realExtensionMethod = realExtensionMethod.MakeGenericMethod(p_Type);
    realExtensionMethod.Invoke(null, new object[] {p_Type, p_Params });
}

Void RealExtension<TYPE>(params)
{

}

次に、使用時に:

Type objectType = typeof(myOtherObject);
myFirstObject.Extension(objectType, other => other.Prop );
于 2013-07-26T18:09:36.667 に答える
0

C# でジェネリック メソッドを呼び出す場合、すべてのジェネリック型パラメーターを明示的に宣言するか、すべてを推論することができますが、一部を明示的に宣言し、一部を推論することはできません。

だから、もし私がこの方法を持っていたら:

public void Foo<X, Y>(X x, Y y)
{
    /* Do somethhing */
}

次に、機能するものと機能しないものを次に示します。

int a = 42;
string b = "Hello, World!";

// Legal
Foo(a, b);
Foo<int, string>(a, b);

//Illegal
Foo<int>(a, b);

最善の方法は、最初のジェネリック パラメータをクラス レベルに移動することですが、そうしないと拡張メソッドとして機能しません。それでも、このアプローチが好きかもしれません。

public static class Class<TSource>
{
    public static bool Method<TIn, TKey>(
        TSource p_Value,
        Expression<Func<TIn, TKey>> p_OutExpression) 
    {
        return true;
    }
}

これで、次のように呼び出すことができます。

Expression<Func<long, decimal>> f =
    l => (decimal)l;

var result = Class<int>.Method(a, f);

しかし、私が言ったように、今は拡張メソッドとして機能しません。

于 2013-07-26T00:31:19.433 に答える