Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于未知类型,如何实现此功能?_C#_Database_Generics_Dynamic_Parameters - Fatal编程技术网

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;