【问题标题】:C# - How to create a dynamic object from a static object?C# - 如何从静态对象创建动态对象?
【发布时间】:2014-06-03 02:56:04
【问题描述】:

假设有一个类型为A 的静态对象。

class A
{
    public string b;
    public int c;
    public bool d;
    public A e;
    .
    .
    .
}

A a = new A(){
    b = "string",
    c = 12,
    d = true
    e = new A(){
            b = "another string",
            c = 23
        }
};

我想deep将此对象克隆到具有所有属性的dynamic 对象中。

【问题讨论】:

  • 让我直说。你是说a 是其他类的静态属性或成员变量吗?如果是这样,请在类A 中编写一个克隆方法,该方法返回一个类型为A 的深层克隆,并将其分配给您想要分配给它的任何东西。属性或成员变量上的修饰符static 的全部含义是属性/成员变量属于类,而不是类的实例。除此之外,该属性/成员变量引用的对象只是一个对象。
  • 您有任何非字符串引用属性吗?如果是这样,您希望如何处理它们?创建它们指向的对象的副本或指向与静态属性相同的实例?

标签: c# clone dynamictype


【解决方案1】:

我会枚举对象的属性 (a.GetType().GetProperties()),区分内置类型、结构和类,并使用ExpandoObject 构建动态对象。

【讨论】:

  • 有没有图书馆可以做到这一点?
  • 我的问题是我有一个复杂的模型,它有多个视图。我想从模型构建动态视图,然后使用 Json.net 将它们序列化为 JSON。 Json.net 有自定义序列化的机制,但在不同场景下从单一模型构建多种类型的序列化并不直接。
  • 在不同的场景中,我必须序列化复杂对象的一部分,而不是整个对象。序列化整个对象非常繁重,有时需要几分钟。
【解决方案2】:

构建复制构造函数:

class A   //<-- this class is static?????
{
  public string b;
  public int c;
  public bool d;
  public A e;

  public A() { }  // add default constructor

  public A(A a){
     b = a.b;
     c = a.c;
     d = a.d;
     if ( a.e != null ) {
        e = new A(a.e);
     }
  }
}

【讨论】:

    【解决方案3】:

    最简单的方法是将类序列化成json,反序列化成动态对象。

    使用 Json.net:

            A a = new A()
            {
                b = "string",
                c = 12,
                d = true,
                e = new A()
                {
                    b = "another string",
                    c = 23
                }
            };
    
            var json = JsonConvert.SerializeObject(a); // create a json 
            dynamic newObj = JsonConvert.DeserializeObject(json);// create a dynamic object
    

    【讨论】:

    • 我的问题是我有一个复杂的模型,它有多个视图。我想从模型构建动态视图,然后使用 Json.net 将它们序列化为 JSON。 Json.net 有自定义序列化的机制,但在不同场景下从单一模型构建多种类型的序列化并不直接。
    • 序列化过程是递归的,可以处理复杂的类型。您将遇到类型问题,例如字典和您需要显式实现一个接口来告诉序列化程序如何处理它的东西。我没有看到无法解决的“复杂”对象有任何问题(如果您没有循环引用)。
    • 复杂类型没有问题。问题是同一模型的多个视图。在不同的场景中,我必须序列化复杂对象的一部分,而不是整个对象。序列化整个对象非常繁重,有时需要几分钟。
    【解决方案4】:

    在C#4.0中,我们有动态的概念,但是如何从静态静态对象创建动态对象呢?

    以下代码将在运行时生成异常。动态对象来自 C# 类,但它可以是通过动态语言运行时 (DLR) 来自其他语言的对象。重点不是如何调用静态方法,而是如何调用C#代码无法创建的动态对象的静态方法。

    类 Foo { 公共静态整数总和(int x,int y) { 返回 x + y; } }

    类程序 {

    static void Main(string[] args)
    {
        dynamic d = new Foo();
        Console.WriteLine(d.Sum(1, 3));
    
    }
    

    }

    动态类型被发明为 C# 和其他编程语言之间的桥梁。还有一些其他语言(例如Java)允许通过对象而不是类型来调用静态方法。

    更多详情请访问 enter link description here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 2017-05-04
      • 2023-03-09
      • 2011-07-12
      • 2016-10-02
      • 1970-01-01
      相关资源
      最近更新 更多