在C#中声明模板化函数的类型

时间:2009-09-23 18:24:49

标签: c# generics functional-programming

在c#中,可以创建一个类似的函数列表:

var myList = new List< Func<Foo> >();

这将允许不带参数的函数(委托)并返回类型为Foo的值添加到列表中。如下所示:

Foo myFunc1() { ... }

将是该列表的有效成员。我的问题是,如何声明模板化函数的类型?如何构建List&lt;&gt;将保存表格的功能:

T myFunc2<T>() { ... }

3 个答案:

答案 0 :(得分:2)

你需要在一个模板化的类或方法中做到这一点。然后,您可以像引用特定类型Foo一样引用泛型类型T.

换句话说:

public class FuncContainer<T> 
{
    private List<Func<T>> list = new List<Func<T>>();

    public void Fill() 
    {
        // Initialize list
    }
}

答案 1 :(得分:1)

认为到目前为止其他答案都误解了这个问题......如果我读得正确的话,我认为你不能真正做到这一点。我是对的,你说你想写这个:

List<???> list = new List<???>(); // This line won't work
list.Add(Method1);
list.Add(Method2);

...

static int Method1() { ... }
static string Method2() { ... }

如果我误解了,并且你的方法或类中的T的简单泛型类型参数就足够了,我将删除这个答案:)

你最接近上面会是这样的:

public class FuncList
{
    private readonly List<Delegate> list = new List<Delegate>();

    public void Add<T>(Func<T> func)
    {
        list.Add(func);
    }
}

然后您将其用作:

FuncList list = new FuncList();
list.Add<int>(Method1);
list.Add<string>(Method2);

以后你用 这个列表很棘手......你有什么想法?

答案 2 :(得分:0)

是的,第一个签名完全有效。

您建议的最后一个功能的签名如下

List<Func<T>> x;

它包含一个不带参数并生成T值的委托列表。