36

ジェネリック型コンバーター関数をメソッドに送信したいのですが、その方法がわかりません。

私が達成したいことを説明する無効な構文を次に示します。問題は、関数と一緒にジェネリック型を指定する方法がわからないことです。

public void SomeUtility(Func<T><object,T> converter)
{
    var myType = converter<MyType>("foo");
}

編集(ローレンスとのコメントでの私の議論も参照してください):「ジェネリック型コンバーター」とは、強い型 <T> (オブジェクトではない)に変換できるコンバーターを渡したいという意味だったので、私の次の行メソッドは次のようになります。

var myOtherType = converter<MyOtherType>("foo");

パラメータとして渡したいデリゲートは、次のようになります。

private delegate TOutput myConverterDelegate<TOutput>(object objectToConvert);

これは、構文/C# の探索に近いものです。物事を成し遂げるために、おそらく代わりにインターフェイスを使用しますが、これが func/delegate で達成できることを願っています。

4

4 に答える 4

29

ジェネリック関数またはアクションのインスタンスを持つことはできません。すべての型パラメーターは事前に定義されており、呼び出し元が再定義することはできません。

簡単な方法は、ダウンキャストに頼ってポリモーフィズムを完全に回避することです。

public void SomeUtility(Func<Type, object, object> converter)
{
    var myType = (MyType)converter(typeof(MyType), "foo");
}

型の安全性が必要な場合は、型パラメーターの定義を呼び出し元に任せる必要があります。これを行うには、インターフェイス内でジェネリック メソッドを作成します。

public void SomeUtility(IConverter converter)
{
    var myType = converter.Convert<MyType>("foo");
}

interface IConverter
{
   T Convert<T>(object obj);
}

編集:

「コンバーター型」が呼び出しサイトで既知であり、この型のみがユーティリティ メソッド内で使用される場合は、他のポスターが提案したように、メソッドでジェネリック型を定義して使用できます。

于 2012-09-25T08:31:47.117 に答える
17
public void SomeUtility<T>(Func<object, T> converter)
{
    var myType = converter("foo");
}

その後:

SomeUtility(arg => new MyType());

この場合、ジェネリック型の推論が機能します。

于 2012-09-25T08:29:09.680 に答える
8

SomeUtilityジェネリックも作成する必要があります。これを実行して構文を修正すると、次のようになります。

public void SomeUtility<T>(Func<object,T> converter)
{
    var myType = converter("foo");
}
于 2012-09-25T08:27:55.890 に答える
4

T を使用するには、コンパイル時に型を知っている必要があります。T は、クラス レベルまたはメソッド レベルで指定できます。

class SomeClass<T> {
    public void SomeUtility(Func<object, T> converter) {
        var myType = converter("foo"); // Already is the T-type that you specified.
    }
}

また

public void SomeUtility<T>(Func<object, T> converter) {
    var myType = converter("foo"); // Already is the T-type that you specified.
}
于 2012-09-25T08:30:31.360 に答える