C# 对于未知类型,如何实现此功能?
我有一些表示数据库表的类(实体)C# 对于未知类型,如何实现此功能?,c#,database,generics,dynamic,parameters,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 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
}
}
否则我如何定义“实体”参数,而不是动态的。它是有效的,只是我在寻找其他的方法,我确信有很多。在您的情况下,
实体不需要是动态的(尽管它肯定是可以的)。使用object
就足够了,因为除了object
提供给您的内容之外,您不会调用任何东西。这是可行的,因为您使用反射。另一方面,使用动态
,您可以指定对象
上找不到的属性,并且编译器不会抱怨
例如,由于ALBUM
和BOOK
都有一个Id
参数,因此可以编写如下内容:
var entityId = entity.Id;
只要实体
是动态的
,这就可以工作;它不适用于对象
您可以使用ExpandoObject类。正如保罗·萨西克所说:
Expando是一种动态类型,旨在通过
在运行时添加/删除成员。dynamic旨在允许.NET
在与动态类型接口时与类型进行互操作
Python和JavaScript等语言
下面是一篇解释ExpandoObject的文章:
我明白了,它们(对象动态)在谈论内存资源或速度时有什么区别吗?+1@Eduardo,在速度上比较object
和dynamic
通常非常困难,因为你不能像dynamicMy.Id
那样做objectMy.Id
。在您的特定情况下,由于您的代码使用了dynamic
中的零功能,因此不太可能存在可测量的差异(请自己尝试-潜在的dynamic可能会稍微慢一点)。也要求调用方传递更复杂的类型(dynamic
vs.object
),没有好的理由,这不是好代码的标志。
var entityId = entity.Id;