代码之家  ›  专栏  ›  技术社区  ›  Kevin Vaughan

可能有未指定类型的泛型方法?

  •  4
  • Kevin Vaughan  · 技术社区  · 16 年前

    我确实需要一个用于加载对象列表的解决方案-在这个示例中,从当前对象中只引用一个属性的查找。

    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; }
    }
    

    在读取WorkingObject.City属性的PropertyInfo之后,我知道查找对象的类型,以及从哪个类中加载它的方法。 现在我需要桥接器来获得一个列表,其中包含三个要使用的参数。

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

    由于我需要使用类型化列表<gt;在UI上使用LookupObjects的属性,如何才能成为代码中可用的列表?

    我的理想结果是,如果我能输入:

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

    从属性中读取参数的位置。

    1 回复  |  直到 16 年前
        1
  •  5
  •   Lasse V. Karlsen    16 年前

    为了生产 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(...)
    

    仍然不会产生 列表& T; 类型 ,它必须使用编译时已知的非泛型类型来存储列表,例如 IList ,但是您存储在其中的对象可以是一个通用对象,按照我上面描述的方式生成。