2013-12-11 31 views
0

我有方法如下使用字符串函数参数为Class类型

public void UpdateDb(int id) 
{ 
    var UpdateMyModel = db.CRM_OPP_DETAILS 
     .Where(p=> p.ID == id) 
     .FirstOrDefault(); 
    UpdateMyModel .IS_VALID = false; 
    db.SaveChanges(); 
} 

我如何使用“MODELNAME字符串参数”作为模型类的名字。 IE浏览器。如下所示:

public void UpdateDb(string ModelName , int id) 
{ 
    var UpdateMyModel = db.""ModelName "" 
     .Where(p=> p.ID == id) 
     .FirstOrDefault(); 
    UpdateMyModel.IS_VALID = false; 
    db.SaveChanges(); 
} 
+0

因此,您使用的是ORM,并且想要在代码中使用表名称? – ken2k

+1

即使你的伪是错误的,第二个'TableName'应该只是UpdateTable,因为它是已经包含'TableName'的变量。另外:@ ken2k说的是什么... – Abbas

+0

是否可以让所有实体实现一个提供ID和IS_VALID的接口? –

回答

0

您可以通过使用泛型和接口来实现此目的。 datacontext支持一个GetTable()方法。

你会使用它,例如像这样:

public void UpdateDb<T>(int id) where T : IUpdateDbInterface 
{ 
    var UpdateTable = db.GetTable<T>() 
         .Where(p=> p.ID == id) 
         .FirstOrDefault(); 

    UpdateTable.IS_VALID = false; 
    db.SaveChanges(); 
} 

interface IUpdateDbInterface { 
    int ID { get; set;} 
    bool IS_VALID { get; set;} 
} 

要叫它:

UpdateDb<MyRecordType>(1234); 

你的泛型类型T需要一个接口约束定义至少int IDbool IS_VALID否则通用代码将不知道它的类型T有这些字段可用。然后当然你希望能够运行这个表的所有都需要实现这个接口。


如果你坚持使用字符串,请使用Type.GetType(...)功能,让您的字符串类的名称为Type。那么你可以使用这样的方法:

public void UpdateDb(Type type, int id) 
{ 
    var UpdateTable = db.GetTable(type) 

    ..... 
} 

但你仍然需要接口的东西来到你的属性。或者对所有东西都使用反射,但是当使用ORM时,这是毫无意义的。

+0

我可以把字符串变量放入UpdateDb umki

+0

我认为你正在寻找这个http://social.msdn.microsoft.com/Forums/en-US/6273d072-f500-4382-afb4-8eafd185794d/linq- to-sql-dynamic-sql-table-name?forum = linqprojectgeneral或this http://www.telerik.com/community/forums/orm/linq-questions/table-name-as-a-parameter.aspx –

+0

使用作为表名的字符串在这一点上是没有意义的。你可以改变方法来使用GetTable()的重载,它接受一个Type而不是Generic,并且使用反射从一个字符串构造这个类型。 –

相关问题