2010-06-08 2 views
2

Я пытаюсь создать общий список из определенного типа, который извлекается из других мест:Использования C# Типа как общий

Type listType; // Passed in to function, could be anything 
var list = _service.GetAll<listType>(); 

Однако я получаю ошибку сборки:

The type or namespace name 'listType' could not be found (are you missing a using directive or an assembly reference?) 

Is это даже возможно или я нахожусь на C# 4 Dynamic территории?

В качестве фона: я хочу автоматически загружать все списки с данными из репозитория. Приведенный ниже код получает форму Form, свойства которой повторяются для любого IEnum (где T наследуется от DomainEntity). Я хочу заполнить список объектами Type, список из которого сделан из репозитория.

public void LoadLists(object model) 
{ 
    foreach (var property in model.GetType() 
     .GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty)) 
    { 
     if (IsEnumerableOfNssEntities(property.PropertyType)) 
     { 
      var listType = property.PropertyType.GetGenericArguments()[0]; 

      var list = _repository.Query<listType>().ToList(); 

      property.SetValue(model, list, null); 
     } 
    } 
} 

ответ

3

Вы не можете передать переменную в качестве родового параметра типа/метод, однако вы можете сделать некоторые простые вещи, используя отражение, например, вы можете построить список таким образом:

Type listType = typeof(int); 
var list = Activator.CreateInstance(typeof(List<>).MakeGenericType(listType)); 

Не уверен, если это будет полезно, так как вам нужно будет отнести этот список к чему-то, чтобы сделать его полезным, и вы не можете просто применить его к универсальному типу/интерфейсу без указания параметров типового типа.

Вы все же можете добавить/перечислить такой список, переведя его в не общие версии интерфейсов ICollection, IList, IEnumerable.

+0

Да, я думал, что может быть. Я потребляю список из метода () в другом месте в системе, поэтому не может создать список с нуля. Спасибо за вашу помощь! –

+0

Вы также можете вызвать общий метод с использованием отражения, но у вас все еще будут те же проблемы с результатом. Проверьте эту статью о вызове динамического общего метода: http://www.codeproject.com/KB/dotnet/InvokeGenericMethods.aspx – max

0

Вы должны сказать ему, что тип listType является

var list = _repository.Query<typeof(listType)>().ToList(); 
+0

Извините, но это уже Тип. typeof() используется для преобразования имени класса, интерфейса и т. д. (т. е. как если бы вы собирались получить к нему статический метод). –

+0

Вы правы. – MQS

Смежные вопросы