我确实需要一个加载对象列表的解决方案 - 查找其中只有一个属性从当前对象引用,如本例所示。
class LookupObjectAddress
{
[...]
public string City
{ get; set; }
[...]
}
class WorkingObject
{
// references the property from LookupObjectAddress
public string City
{ get; set; }
}
对于查找我需要从数据库加载一个List,知道从哪里加载我使用属性的信息
class WorkingObject
{
// references the property from LookupObjectAddress
[Lookup(Type=typeof(LookupObjectAddress), staticloaderclass="LookupObjLoader", staticloaderMethod="LookupObjLoadMethod")]
public string City
{ get; set; }
}
在读出了WorkingObject.City属性的PropertyInfo之后,我知道了查找对象的类型,以及从哪个类加载它的方法。 现在我需要桥接器来获取具有这三个参数的List。
Type loaderClass = Type.GetType(classname);
MethodInfo loaderMethod = loaderClass.GetMethod(loadmethod);
object objList = loaderMethod.Invoke(null, new object[] {});
因为我需要输入的List<>要在UI上使用LookupObjects的属性,我如何成为Code中的可用列表?
如果我能输入:
,我的理想结果就是var list = Loader.Load(type, "LookupObjLoader", "LookupObjLoadMethod");
从属性中读取参数。
答案 0 :(得分:5)
为了在运行时产生List<T>
类型,因此实例,其中T来自Type
对象(即在编译时不知道),你会这样做:< / p>
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>
类型,它必须使用非通用的,编译时已知的类型来存储列表,例如{{1}但是,您存储在其中的对象可以是通用对象,按照我上面描述的方式生成。