【问题标题】:Using String Function Parameter as Class Type使用字符串函数参数作为类类型
【发布时间】:2013-12-11 12:24:06
【问题描述】:

我有如下方法

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

如何使用“模型名称字符串参数”作为模型类名称。 IE。如下:

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

【问题讨论】:

  • 所以你正在使用 ORM 并且你想在你的代码中使用表名?
  • 即使你的伪错误,第二个 TableName 也应该只是 UpdateTable,因为它是已经包含 TableName 的变量。另外:@ken2k 所说的...
  • 你能让你的所有实体实现一个提供ID和IS_VALID的接口吗?
  • 对不起,我已经编辑了我的问题。

标签: c# asp.net linq asp.net-mvc-4


【解决方案1】:

您可以通过使用泛型和接口来实现这一点。 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 时这严重没有意义。

【讨论】:

  • 我可以将字符串变量放入 UpdateDb
  • 此时使用字符串作为表名没有意义。您可以更改方法以使用采用 Type 而不是 Generic 的 GetTable() 的重载,并使用反射从字符串构造类型。
  • 我无法调用 db.GetTable().. 我需要包含一些东西吗?
  • @modulerica 您使用哪个ORM?实体框架?
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 2021-09-20
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多