C# 我可以从一个字符串开始并实例化该字符串的对象吗?
我目前与LINQ和C合作 在我的LINQtoSQL模型中有一个表的下拉列表 我希望用户能够从下拉列表中选择LINQ表名。在代码中,我想创建该LINQ类的一个实例,然后运行Select或it或任何我想要的东西 如何根据用户选择的字符串中的对象名称创建对象?我从一开始就没有正确地思考吗?你想要和 请注意,Type.GetTypestring将仅查找当前正在执行的程序集和mscorlib,除非指定包含程序集的完整类型名。在这两种情况下,都需要指定类型名,包括名称空间 另一种方法是在调用Activator.CreateInstance之前,直接从字符串获取类型C# 我可以从一个字符串开始并实例化该字符串的对象吗?,c#,.net,asp.net,linq-to-sql,C#,.net,Asp.net,Linq To Sql,我目前与LINQ和C合作 在我的LINQtoSQL模型中有一个表的下拉列表 我希望用户能够从下拉列表中选择LINQ表名。在代码中,我想创建该LINQ类的一个实例,然后运行Select或it或任何我想要的东西 如何根据用户选择的字符串中的对象名称创建对象?我从一开始就没有正确地思考吗?你想要和 请注意,Type.GetTypestring将仅查找当前正在执行的程序集和mscorlib,除非指定包含程序集的完整类型名。在这两种情况下,都需要指定类型名,包括名称空间 另一种方法是在调用Activato
实际上这里有很多选择。如果这些都对您没有帮助,请发布更多信息,我相信我们可以找到解决方法。由于您使用ASP.NET标记了帖子,我假设列表位于客户端。如果是这样的话,您应该非常小心,不要相信这些数据,我不建议直接从用户输入创建类型。您可以使用这些数据作为工厂的输入,然后工厂可以返回正确的实例,并在您认为合适的情况下处理任何非法输入 对于LINQ to SQL,有从数据上下文执行此操作的特定方法;基本上,db.GetTable。这将返回一个ITable,但使用非类型化的ITable有点棘手。你可以列举它,至少 要获取ITable,通常需要类型,例如Assembly.GetType: 当然,一旦有了类型,就可以使用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...
}
}
在etc中运行过滤器对于非类型化的数据是很棘手的,因为构建表达式将是曲折的。那时我可能会开始切换到类型化模型…详细阐述Brian Rasmussen的警告:类型应该受到限制,需要有意识的设计。用户可实例化类型最好使用特定的自定义属性进行标记,该属性可以通过反射进行验证。继续Marc Gravell的回答 按照他的建议,我注意到System.Linq中定义了一个Cast扩展方法 不幸的是,您似乎无法使用类型实例强制转换:
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);
这里似乎有人问我想做什么:
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);