Использование неизвестного универсального интерфейса в статическом поле, возвращающем Func - PullRequest
1 голос
/ 01 июня 2011

В моем классе есть следующее статическое поле

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 ]

1 голос
/ 01 июня 2011

Вы не можете иметь общее поле; вы можете , однако, поместите это в общий статический тип:

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

и используйте

Foo<YourType>.Make

Возможно, вы захотите привести это в порядок (внутреннее поле и т. Д.)

0 голосов
/ 01 июня 2011

Вы также можете преобразовать поле в универсальный метод:

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

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

Если у вас уже есть что-то типа T, вы можете создать метод, который выводит T из использования:

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

// call
var definition = Make(reader, someInstanceT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...