在静态字段中使用未知的通用接口返回Func

时间:2011-06-01 12:46:27

标签: c# generics lambda

我的课程中有以下静态字段

private static Func<IDataReader, Project> Make = reader =>
    new Project
    {
        Name = reader["ProjectName"].AsId(),
        StartDate = reader["StartDate"].AsDateTime(),
        EndDate = reader["EndDate"].AsDateTime()
    };

我正在尝试使用通用接口执行相同操作,但无法确定如何定义泛型类型。这将是一个类似的事情。

private static Func<IDataReader, IDefinition<T>> Make<T> = reader =>
    new Definition<T>
    {
        Name = reader["DefinitionName"].AsId()
    };

这显然不起作用,但有谁知道我怎么能实现这个目标?

2 个答案:

答案 0 :(得分:1)

你不能拥有通用字段;但可以,将其推送到通用静态类型:

static class Foo<T> {
    internal static readonly Func<IDataReader, IDefinition<T>> Make = reader =>
        new Definition<T> {
            Name = reader["DefinitionName"].AsId()
        };
}

并使用

Foo<YourType>.Make

你可能想整理一下(内部领域等)

答案 1 :(得分:0)

您还可以将字段转换为通用方法:

private static IDefinition<T> Make<T>(IDataReader reader)
{ 
    new Definition<T>
    {
        ...
    };
}

// call
var definition = Make<SomeType>(reader);

如果你已经有类型T的东西,你可以制作一个从使用中推断出来的方法:

private static IDefinition<T> Make<T>(IDataReader reader, T something)
{ 
    new Definition<T>
    {
        ...
    };
}

// call
var definition = Make(reader, someInstanceT);