我目前正在使用LINQ和C#。我可以从一个字符串开始并实例化该字符串的一个对象吗?
我有我的LINQ to SQL模型中的表的DropDownList。
我希望用户能够从DropDown中选择一个LINQ表名。在代码中,我想创建一个LINQ类的实例,然后运行一个Select或它或我想要的任何其他东西。
我该如何完成基于用户选择的字符串中的对象名称来创建对象?我从一开始就错误地思考?
我目前正在使用LINQ和C#。我可以从一个字符串开始并实例化该字符串的一个对象吗?
我有我的LINQ to SQL模型中的表的DropDownList。
我希望用户能够从DropDown中选择一个LINQ表名。在代码中,我想创建一个LINQ类的实例,然后运行一个Select或它或我想要的任何其他东西。
我该如何完成基于用户选择的字符串中的对象名称来创建对象?我从一开始就错误地思考?
你想要Type.GetType(string)和Activator.CreateInstance(Type)。
注意Type.GetType(字符串)只会看在当前执行的程序集和mscorlib程序,除非你指定完整的类型名称包括装配。无论哪种情况,您都需要指定包括名称空间的类型名称。
另一种方法是使用Assembly.GetType(string)从字符串调用Activator.CreateInstance前直接拿到类型。
(实际上有很多这里的替代品。如果没有这些帮助,请发布更多的信息,我相信我们可以制定出很长的路要走。)
既然你标记的帖子与ASP.NET,我假设列表是在客户端。如果是这样的话,你应该非常小心信任这些数据,而且我不建议直接从用户输入创建类型。您可以将数据用作工厂的输入,然后可以返回正确的实例(并根据需要处理任何非法输入)。
使用LINQ到SQL,也有从数据方面这样做的具体方式;基本上,db.GetTable
。这将返回ITable
,但它是一个有点棘手与非类型化ITable
工作。您可以枚举它,至少...
要获得ITable
,你通常需要Type
,您可以得到(例如)Assembly.GetType
:
using (var ctx = new MyDataContext()) {
string name = "Customer"; // type name
Type ctxType = ctx.GetType();
Type type = ctxType.Assembly.GetType(
ctxType.Namespace + "." + name);
ITable table = ctx.GetTable(type);
foreach(var row in table) {
Console.WriteLine(row); // works best if ToString overridden...
}
}
当然,一旦你有Type
,你用用Activator
创建新的实体实例:
object newObj = Activator.CreateInstance(type);
// TODO: set properties (with reflection?)
table.InsertOnSubmit(newObj);
,但如果你想使用的属性名称,可以工作了:
using (var ctx = new MyDataContext()) {
string name = "Customers"; // property name
ITable table = (ITable) ctx.GetType()
.GetProperty(name).GetValue(ctx, null);
foreach (var row in table) {
Console.WriteLine(row); // works best if ToString overridden...
}
}
运行过滤器(Where
)等是非常棘手的无类型数据,因为构建Expression
会曲折。我可能在这个点开始转换到类型化的模式...
在阐述布莱恩·拉斯穆森警告:该类型应该被限制,需要有意识的设计。优选的“用户可实例化”类型应该用可以用反射验证的特定自定义属性进行标记。
要遵循马克Gravell的答案。
按照他的建议,我注意到一个Cast<TResult>
扩展方法(在System.Linq中定义)。
不幸的是,你似乎无法能够做到使用type
实例投:
Type dcType = dc.GetType();
Type type = dcType.Assembly.GetType(String.Format("{0}.{1}", dcType.Namespace, name));
var row = dc.GetTable(type).Cast<type>().SingleOrDefault(i => i.ID == 123);
看来,我想要做的是在这里问:http://stackoverflow.com/问题/ 791187 /使用反射到地址-A-linqed属性 – bounav 2009-07-16 12:56:28