1

無理かもしれませんが、そう願っています!

ジェネリック型のスコープを持ち、インスタンス化するメソッドがありList<Func<GenericType>>ます。次に、を受け取る別のメソッドがありList<Func<T>>ます。Tこの方法では知識がありません。

サンプルコード

public void PassFuncs<Item>()
{
  List<Func<Item>> funcs = new List<Func<Item>>();
  RecieveFuncs(funcs);
}
public void RecieveFuncs(List<Func<object>> funcs)
{
  //Do some stuff with funcs
}

object代わりに使用するのTと同じくらい簡単で、それと同じくらい簡単になることを望んでいました. もちろん、Tではなく、objectTypeあり、したがって、それらを交換することはできません。何か提案はありますか、それとも不可能ですか?

4

4 に答える 4

4

メソッドをジェネリックにすることができます:

public void RecieveFuncs<T>(List<Func<T>> funcs)
{
  //Do some stuff with funcs
}

Tそれを呼び出すには、明示的に宣言することができます

public void PassFuncs<Item>()
{
  List<Func<Item>> funcs = new List<Func<Item>>();
  RecieveFuncs<Item>(funcs);
}

または、型推論の魔法に任せて、呼び出しをそのままにします。

public void PassFuncs<Item>()
{
  List<Func<Item>> funcs = new List<Func<Item>>();
  RecieveFuncs(funcs);  // C# automatically infers T = Item
}
于 2013-01-14T10:40:39.490 に答える
3

それが参照型であることがわかっている場合Itemは、各関数の分散を使用できます (ただし、リストの分散は使用できません)。

public void PassFuncs<Item>() where Item : class
{
    List<Func<Item>> funcs = new List<Func<Item>>();
    var tmp = funcs.ConvertAll(func => (Func<object>)func);
    RecieveFuncs(tmp);
}

これにより、新しいリストが作成されますが、元の関数が使用されます。それが不可能な場合は、中間関数を追加する必要があります。

public void PassFuncs<Item>()
{
    List<Func<Item>> funcs = new List<Func<Item>>();
    var tmp = funcs.ConvertAll<Func<object>>(func => () => func());
    RecieveFuncs(tmp);
}
于 2013-01-14T10:43:38.200 に答える
3

RecieveFuncs何らかの理由でジェネリックを作成できない場合は、次を使用できます。

public void PassFuncs<TItem>()
    where TItem:class
{
  List<Func<TItem>> funcs = new List<Func<TItem>>();
  RecieveFuncs(funcs);
}

public void RecieveFuncs(IEnumerable<Func<object>> funcs)
{
  //Do some stuff with funcs
}

これには、 の型を参照するための一般的な制約が必要であり、受信側ではなく、 のTItemような共変インターフェイスが必要です。本当に を受け取りたい場合は、 で新しいリストを作成できます。IEnumerable<T>List<T>List<Func<object>>List<Func<object>>(funcs)

于 2013-01-14T10:44:06.970 に答える
0

このようにFunc<Item>to を「キャスト」できますFunc<object>

public delegate object Func();

public void PassFuncs<Item>()
{
  List<Func<Item>> funcs = new List<Func<Item>>();
  RecieveFuncs(funcs.Select<Func<Item>, Func<object>>(f => () => (object)f())
                    .ToList());
}

public void RecieveFuncs(List<Func<object>> funcs)
{
  //Do some stuff with funcs
}

これは、参照型と値型の両方で機能しますが、値型ではボックス化されます。参照型のみを使用する場合は、@CodesInChaos 回答を使用してください。

于 2013-01-14T10:55:31.970 に答える