Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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# 字典动态vs对象和引用_C# - Fatal编程技术网

C# 字典动态vs对象和引用

C# 字典动态vs对象和引用,c#,C#,我有自己的数据类型用于数据库,该数据库具有各种属性来操作值,例如: First: original value IsNull: is the current state null (no value in Data) IsFirstNull: was the initial state of the object null Changed: has the value changed since the initial value was set. SetNull(): set the obje

我有自己的数据类型用于数据库,该数据库具有各种属性来操作值,例如:

First: original value
IsNull: is the current state null (no value in Data)
IsFirstNull: was the initial state of the object null
Changed: has the value changed since the initial value was set.
SetNull(): set the object to null
SetFirstNull: set the initial value to null
Reset: set values all to original settings.
每个对象都有这些。每种类型的标准变量都有一个对象,例如:

int - IntType
string - StringType
bool - BoolType
对于我使用的每个表,我在一个类中都有这些变量

我希望能够访问这些,所以我正在考虑将它们添加到字典中。但每个项目都是不同的类型(IntType、StringType、BooltType等)

所以我将它们设置为
字典
字典

不确定哪一个是最好的-一个比另一个好吗

 public class LoginDC
 {
    private IntType loginID = new IntType();
    private StringType userName = new StringType();

    public LoginDC()
    {
       Dictionary<string, dynamic> propertyList = new Dictionary<string, dynamic>();

       propertyList.Add("LoginID", loginID);
       propertyList.Add("UserName", userName);

       propertyList["UserName"].First = "Tom"
    }
 }
公共类LoginDC
{
private IntType loginID=new IntType();
私有StringType用户名=新StringType();
公共后勤中心()
{
Dictionary propertyList=新字典();
添加(“LoginID”,LoginID);
添加(“用户名”,用户名);
propertyList[“UserName”]。First=“Tom”
}
}
所以我的另一个问题是:

propertyList是否在.Add之后包含对loginID和用户名的引用?因此,如果我更改propertyList或变量,两者都将包含相同的值。或者propertyList是否在两个变量中包含值的副本

这似乎是一个参考,但不确定。

无论是
字典
还是
字典
都有其不利的一面。使用
对象
,您必须先将每个对象强制转换为其类型,然后才能使用它。使用
dynamic
,您将丢失对所调用方法的编译时检查,从而增加了发生错误的可能性,而这些错误直到太晚才被发现

我不建议你采取你正在采取的方法。评论者是对的:你似乎在试图重新发明轮子。有很多非常好的库可以将数据从数据库映射到对象。使用免费提供的东西

回答你的第二个问题:

  • 如果自定义对象类型是
    class
    es,则
    propertyList
    包含对它们的引用
  • 如果它们是
    struct
    s,它将包含它们的一个副本
您可以通过在LinqPad之类的工具中运行这样的快速脚本来测试这一点:

void Main()
{
    var a = new A{I = 1};
    var b = new B{I = 1};
    var propertyList = new Dictionary<string, dynamic>();
    propertyList.Add("a", a);
    propertyList.Add("b", b);
    a.I = 2;
    b.I = 2;
    foreach (var value in propertyList.Values)
    {
        Console.WriteLine(value.I);
    }
    // Output:
    //  2
    //  1
}

public class A{public int I{get;set;}}
public struct B{public int I{get;set;}}
void Main()
{
var a=新的a{I=1};
var b=新的b{I=1};
var propertyList=新字典();
添加(“a”,a);
添加(“b”,b);
a、 I=2;
b、 I=2;
foreach(propertyList.Values中的var值)
{
控制台写入线(value.I);
}
//输出:
//  2
//  1
}
公共类A{public int I{get;set;}}
公共结构B{public int I{get;set;}}

我有自己的数据类型用于数据库
-伙计,你在试图重新发明轮子。改用ORM。另外,您的
IsNull()
如何处理不可为空的(值)类型,例如
int
?不,LoginID将包含您添加的内容,如果您更改LoginID,
propertyList
中的元素将保持不变。这种类型的元素看起来像您的胆量。我同意这是试图复制其他人所做的工作。试试ORM。罗布·科纳利的巨片很棒!我不知道你想要实现什么,但是在它们之间
object
更好。更好的方法是为您的类型提供一个基类(或接口),并使用它而不是
对象
动态
。我了解其他库。这是我几年前的代码,我正在更新它,同时也在研究不同的技术。如果我将原始字典行从动态更改为对象-我将如何更改该行:propertyList[“UserName”]。First=“Tom”这不适用于对象-我将如何在不知道对象是什么的情况下强制转换它?显然,有了dynamic,我不需要知道。这正是我试图实现的。
((StringType)propertyList[“UserName”])。First=“Tom”
实际上这不起作用,因为我要使用的方法是将字符串名称传入(UserName)。所以我不知道是哪种类型。在监视窗口中,propertyList2[“userName”]返回{DataLayer.StringType}。所以我试着:((propertyList2[“userName”])propertyList2[“userName”])。首先,这给了我一个错误,说“预期”,不知道为什么。所以实际上,dynamic可能更好,因为它知道类型,我不必给它。谢谢。@user2462093:如果你不知道
propertyList[“userName”]
是一个
StringType
,你知道什么?如果你知道它有一个
First
属性,这个属性是
string
,那么你应该能够为它定义一个接口,并将对象强制转换到该接口。如果你知道它有一个
First
属性,但你不知道该属性有什么类型,那么如何定义呢你知道你可以给它赋值吗?但我不知道它是什么。它也可以是propertyList[“LoginId”],这是一个IntType。密钥会被传入,所以我不知道类型是什么。在我的代码中,这个特定字典的实际用途是将值设置为null。因此,会调用一个在密钥中传递的SetNull函数(它来自枚举,因此不可能出错),然后类似的内容将被调用:propertyList[keyName].SetFirstNull()。与其他示例一样,它仍然需要一个类型。我也尝试了这个方法,但没有成功:propertyList[“UserName”].GetType()。