2009-10-20 72 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[] {}); 

因为我需要的类型化列表<>使用UI上的LookupObjects的性质,我怎么能成为在代码中可用列表?

我理想中的结果将是,如果我可以键入:

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

其中的参数是从属性读取。 (即在编译时不知道)

+1

我真的不明白你的问题。你是说loaderMethod.Invoke()应该返回一个List 而不是? – GenericTypeTea 2009-10-20 09:03:49

+0

你可以写一些代码,这是你的理想结果吗? – GenericTypeTea 2009-10-20 09:07:01

+0

这是对的,为了与列表正常工作,我需要知道硬编码列表的类型。但是我希望用户控件能够尽可能通用,而不是每个ObjectType的Case都具有查找功能。 – 2009-10-20 09:12:19

回答

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

这应该做。感谢它。 – 2009-10-20 09:58:52

相关问题