创建字符串中指定类型的对象

时间:2017-12-05 20:01:32

标签: c# class generics types

我有很多由EF生成的类,它们都是简单的表,结构相似:

public class Contact
{
    public int ID { get; set; }
    public string Description { get; set; }
}

public class Member
{
    public int ID { get; set; }
    public string Description { get; set; }
}

我还有一个返回指定类型对象的方法:

public T GetInstance<T>(string type)
{
    return (T)Activator.CreateInstance(Type.GetType(type));
}

我想做的是这样的事情:

public ActionResult GetAll(string ClassType)        // ClassType will be the name of one of the classes above
{
    Object LookupType = GetInstance<Object>(ClassType);

    List<LookupType> AllList = new List<LookupType>();

    AllList = repo.GetAll<LookupType>().ToList<LookupType>();    // some generic method that will return a list;
}

这使编译器生气,因为我使用变量(LookupType)而不是真实类型来构建列表。但是,这些都不起作用:

List<LookupType.GetType()> Items = new List<LookupType.GetType()>();
List<typeof(LookupType)> Items = new List<typeof(LookupType)>();

两者都会导致错误 - “使用泛型类型List需要1个类型参数”。

有没有正确的方法呢?有没有办法将ClassType直接转换为一个类型而不首先使它成为一个对象(我希望从中推导出该类型)?

3 个答案:

答案 0 :(得分:2)

尝试使用CreateInstance方法

SomeObject someObject = new SomeObject();
Type type = someObject.GetType();

Type listType = typeof(List<>).MakeGenericType(new [] { type });
IList list = (IList)Activator.CreateInstance(listType);

答案 1 :(得分:0)

你不能用C#做!! 编译器必须知道参数类型。 也许你想完成,接口会帮助你

public class Contact: IIdDescription
{
        public int ID { get; set; }
        public string Description { get; set; }
}

public class Member: IIdDescription
{
     public int ID { get; set; }
     public string Description { get; set; }
}

public interface IIdDescription
{
     int ID { get; set; }
     string Description { get; set; }
}



public ActionResult GetAll(string type)         
{
   var AllList = new List<IIdDescription>();

   if(type == Member.GetType().Name)
      AllList = repo.Set<Member>().Cast<IIdDescription >().ToList();
   if(type == Contact.GetType().Name)
       AllList = repo.Set<Contact>().Cast<IIdDescription >().ToList();

   ...
}

并在您的视图中使用界面作为模型,类似于

 @model IEnumerable<IIdDescription>

答案 2 :(得分:0)

如果您提前不知道类型,那么使用动态对象列表可能有所帮助。

    var item = GetInstance<Contact>("Namespace.Contact");
    var items = new List<dynamic>();

    items.Add(item);

然后您可以访问类似的类型......

Contact contact = items[0];

请注意,使用动态可能会很昂贵。