我有很多由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直接转换为一个类型而不首先使它成为一个对象(我希望从中推导出该类型)?
答案 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];
请注意,使用动态可能会很昂贵。