Учитывая Generic <E>, как создать новый E и вернуть его? - PullRequest
1 голос
/ 28 октября 2010

Этот код возвращает переменный набор полей, и я хочу вернуть строго типизированный <E>:

public IList<E> Get(Expression<Func<E, object>> selectLambda == null)
{
    if (selectLambda == null)
        selectLambda = p => p;
    var partialSet = DC.CreateQuery<E>("[" + typeof(E).Name + "]");
    foreach ( var record in partialSet)
    {
        var tempEntity = new E();  // This is the error
        MapIt( record, tempContract);
        result.Add(tempContract);
    }
    return result;
}

Ответы [ 4 ]

3 голосов
/ 28 октября 2010

Самый простой способ - добавить ограничение:

public IList<E> Get(Expression<Func<E, object>> selectLambda == null)
    where E : new()

Тогда остальная часть вашего кода будет скомпилирована:)

Если вы не можете использовать ограничения там (например, потому что они будут распространяться повсеместно), но вы знаете, что они будут работать во время выполнения, вы можете использовать:

var tempEntity = Activator.CreateInstance<E>();
2 голосов
/ 28 октября 2010

Вам нужно ограничение для E:

public IList<E> Get() where E : new()

Таким образом, вы убедитесь, что E имеет конструктор без параметров.

Cheers Matthias

1 голос
/ 28 октября 2010

E должно поддерживать определение new () в соответствии с общим ограничением (т. Е. E должно быть ": new ()")

0 голосов
/ 28 октября 2010

Если E не имеет пустого конструктора, вы можете передать делегат вашему методу, который вы можете использовать для создания E. В этом случае вызывающий метод будет отвечать за передачу соответствующего делегата.

public IList<E> Get(Expression<Func<E, object>> selectLambda == null, Func<E> creator)
{
    // ...
    var tempEntity = creator();  
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...