4

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

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、BoolType 等)。

所以我将它们设置为Dictionary<string, object>Dictionary<string, dynamic>

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

 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"
    }
 }

所以我的另一个问题是:

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

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

4

1 回答 1

2

两者Dictionary<string, object>都有Dictionary<string, dynamic>其缺点。使用object,您必须先将每个对象转换为其类型,然后才能使用它。使用dynamic,您将失去对您调用的方法的编译时检查,从而增加出现错误的可能性,直到为时已晚。

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

回答你的第二个问题:

  • 如果您的自定义对象类型是classes,则propertyList包含对它们的引用。
  • 如果它们是structs,它将包含它们的副本。

您可以通过在 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;}}
于 2013-06-13T18:17:19.753 回答