2009-10-20 2 views
4

Мне нужно решение для загрузки списков объектов - поиск, на который ссылается только одно свойство из текущего объекта, как в этом примере.Возможно использование общего метода с неуказанным типом?

class LookupObjectAddress 
{ 
[...] 
public string City 
{ get; set; } 
[...] 
} 

class WorkingObject 
{ 
// references the property from LookupObjectAddress 
public string City 
{ get; set; } 
} 

Для поиска мне нужен список должен быть загружен из базы данных, чтобы узнать, откуда загрузить информацию, которую я использую атрибут

class WorkingObject 
{ 
// references the property from LookupObjectAddress 
[Lookup(Type=typeof(LookupObjectAddress), staticloaderclass="LookupObjLoader", staticloaderMethod="LookupObjLoadMethod")] 
public string City 
{ get; set; } 
} 

После зачитав PropertyInfo для WorkingObject.City Свойство Я знаю тип объекта поиска и из какого класса, с каким методом его загрузить. Теперь мне нужен мост, чтобы получить список с тремя параметрами для работы.

Type loaderClass = Type.GetType(classname); 
MethodInfo loaderMethod = loaderClass.GetMethod(loadmethod); 
object objList = loaderMethod.Invoke(null, new object[] {}); 

Поскольку мне нужен список напечатанного <> для использования свойств LookupObjects на UI, как я могу стать годным к употреблению списка в коде?

Мой идеальный результат был бы, если бы я мог просто напечатать:

var list = Loader.Load(type, "LookupObjLoader", "LookupObjLoadMethod"); 

где параметры считываются из атрибута. (Т. Е не известно во время компиляции)

+1

Я не совсем понимаю ваш вопрос. Вы говорите, что loaderMethod.Invoke() должен вместо этого возвращать список ? – GenericTypeTea

+0

Можете ли вы написать код, который является вашим идеальным результатом? – GenericTypeTea

+0

Правильно, чтобы правильно работать со списком, мне нужно было бы знать жесткий код, в котором находится список. Но я хочу, чтобы UserControl для этого был как можно более общим, а не с Cases для каждого объекта ObjectType, который у меня есть как Lookup-possible. –

ответ

5

Для того, чтобы произвести тип List<T>, и, таким образом, экземпляр, во время выполнения, где T исходит от Type объекта, вы могли бы сделать это:

Type genericListType = typeof(List<>); // yes, this really is legal syntax 
Type elementType = ... 
Type specificListType = genericListType.MakeGenericType(elementType); 
// specificListType now corresponds to List<T> where T is the same type 
// as elementType 
IList list = (IList)Activator.CreateInstance(specificListType); 

Этот будет производить во время выполнения правильный тип списка и сохранить его в переменной list.

Обратите внимание, что нет никакого способа, вы можете получить компилятор выводить тип переменного, так это:

var list = Loader.Load(...) 

по-прежнему не производит List<T>типа, то придется использовать необщий , известный в момент компиляции, чтобы сохранить список, например IList, но объект, который вы храните в нем, может быть общим, созданным способом, описанным выше.

+0

Это должно быть сделано. Спасибо за это. –

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