对于未知类型的动态,这可能是如何实现的?

时间:2013-03-16 00:21:48

标签: c# database generics dynamic parameters

我有一些代表数据库表的类(实体)

public class ALBUM
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Tracks { get; set; }
}
public class BOOK
{
    public int Id { get; set; }
    public string Author { get, set; }
}

然后获取各个存储过程的参数,插入,更新,任何

public Command getParameters(string spName, dynamic entity, Connection conn)
{
   Command cmd = conn.CreateCommand();
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.CommandText = spName;

   // Get properties (fields) from entity (table)
   PropertyInfo[] properties = entity.GetType().GetProperties();

   for (int = 0; i < properties.Length; i++)
   {
       // here I set Parameters: name, DBType, and Value from properties
   }
}

现在我打电话给

public void Some()
{
   ALBUM someAlbum = new ALBUM();
   BOOK anyBook = new BOOK();      // all respective data from DB is set

   Command newCommand = getParameters("myAlbumSP", someAlbum, myConnection);
   Command newCommand = getParameters("mySPBooks", anyBook, myConnection);
}

我如何定义“实体”参数?,不是动态的 它有效,只是我正在寻找其他方法来做到这一点,我确定有很多。

2 个答案:

答案 0 :(得分:2)

在您的情况下,entity需要dynamic(虽然它当然可以)。使用object代替就足够了,因为你不会在object给你的东西之外调用任何东西。这是有效的,因为您使用反射。另一方面,使用dynamic,您可以指定object上找不到的属性,编译器不会抱怨。

例如,由于ALBUMBOOK都有Id参数,您可以这样写:

var entityId = entity.Id;

只要entitydynamic,这就有效;它不适用于object

答案 1 :(得分:0)

您可以使用 ExpandoObject 类。正如Paul Sasik所说:

  

Expando是一种动态类型,用于处理动态数据   在运行时添加/删除成员。 dynamic旨在允许.NET   在与动态类型进行交互时与类型进行互操作   Python和JavaScript等语言。

https://stackoverflow.com/a/3540291/322848

这是一篇解释 ExpandoObject

的文章

http://blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx