2009-01-11 60 views
3

我目前正在使用LINQ和C#。我可以从一个字符串开始并实例化该字符串的一个对象吗?

我有我的LINQ to SQL模型中的表的DropDownList。

我希望用户能够从DropDown中选择一个LINQ表名。在代码中,我想创建一个LINQ类的实例,然后运行一个Select或它或我想要的任何其他东西。

我该如何完成基于用户选择的字符串中的对象名称来创建对象?我从一开始就错误地思考?

回答

6

你想要Type.GetType(string)Activator.CreateInstance(Type)

注意Type.GetType(字符串)只会看在当前执行的程序集和mscorlib程序,除非你指定完整的类型名称包括装配。无论哪种情况,您都需要指定包括名称空间的类型名称。

另一种方法是使用Assembly.GetType(string)从字符串调用Activator.CreateInstance前直接拿到类型。

(实际上有很多这里的替代品。如果没有这些帮助,请发布更多的信息,我相信我们可以制定出很长的路要走。)

3

既然你标记的帖子与ASP.NET,我假设列表是在客户端。如果是这样的话,你应该非常小心信任这些数据,而且我不建议直接从用户输入创建类型。您可以将数据用作工厂的输入,然后可以返回正确的实例(并根据需要处理任何非法输入)。

1

使用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会曲折。我可能在这个点开始转换到类型化的模式...

1

在阐述布莱恩·拉斯穆森警告:该类型应该被限制,需要有意识的设计。优选的“用户可实例化”类型应该用可以用反射验证的特定自定义属性进行标记。

0

要遵循马克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); 
+0

看来,我想要做的是在这里问:http://stackoverflow.com/问题/ 791187 /使用反射到地址-A-linqed属性 – bounav 2009-07-16 12:56:28

相关问题