我有一些代表数据库表的类(实体)
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);
}
我如何定义“实体”参数?,不是动态的 它有效,只是我正在寻找其他方法来做到这一点,我确定有很多。
答案 0 :(得分:2)
在您的情况下,entity
不需要为dynamic
(虽然它当然可以)。使用object
代替就足够了,因为你不会在object
给你的东西之外调用任何东西。这是有效的,因为您使用反射。另一方面,使用dynamic
,您可以指定object
上找不到的属性,编译器不会抱怨。
例如,由于ALBUM
和BOOK
都有Id
参数,您可以这样写:
var entityId = entity.Id;
只要entity
为dynamic
,这就有效;它不适用于object
。
答案 1 :(得分:0)
您可以使用 ExpandoObject 类。正如Paul Sasik所说:
Expando是一种动态类型,用于处理动态数据 在运行时添加/删除成员。 dynamic旨在允许.NET 在与动态类型进行交互时与类型进行互操作 Python和JavaScript等语言。
https://stackoverflow.com/a/3540291/322848
这是一篇解释 ExpandoObject :
的文章