如何在C#中组合部分类对象?

时间:2011-12-11 17:56:16

标签: c# json partial-classes

我定义了一个类:

public class Sample{
    public string name {get;set;}
    public int price {get;set}
}

然后

 Sample sampleA = new Sample();
 sampleA.name = "test";

  Sample sampleB = new Sample();
  sampleB.price = 100;

我这样做是因为我将JSONed sampleA和JSONed sampleB保存到Azure表中,以呈现完整的示例对象。在其他代码中,有时只需要名称,有时只需要价格,所以我只需要提取每次需要的数据。当然,在实际代码中,样本的结构要复杂得多。

我的问题是:,有什么简单方法可以做到:

  Sample sampleC = sampleA + sampleB;

和sampleC应包含:

 sampleC.name = "test";
  sampleC.price = 100;

4 个答案:

答案 0 :(得分:6)

这实际上与部分类无关。部分类是一个单独的类,它在“地理上”声明多于一个文件。

<强> File1.cs:

public partial class File { public string Prop2 { get;set; } }

<强> File2.cs:

public partial class File { public int Prop1 { get;set; } }

在编译时会生成:

public partial class File 
{
     public string Prop2 { get;set; } 
     public int Prop1 { get;set; } 
}

根据您的要求。
没有这样的方法,它将两个不同的实例合二为一。你应该自己写。

<强>更新
你可能会问,为什么没有这样的方法。但它如何处理如下情况:

Sample sampleA = new Sample();
sampleA.name = "test";
sampleA.price = 200;

Sample sampleB = new Sample();
sampleB.price = 100;

Sample sampleC = sampleA + sampleB; // what would be the value of price here: from sampleA or sampleB?

答案 1 :(得分:4)

你如何重载+ operator

    public static Sample operator +(Sample left, Sample right)
    {
        left.price = right.price;
        return left;
    }

答案 2 :(得分:2)

您可以通过重载类上的+运算符来实现此目的。像这样的东西

public static Sample operator +(Sample sampleA, Sample sampleB){
    return new Sample() { Name = sampleA.Name, Price = sampleB.Price };
}

答案 3 :(得分:0)

作为Eric Yin mentioned的答案,partial class是一个不恰当的名称,因为它完全引用其他内容。

  

可以拆分类或结构的定义,a   接口或两个或多个源文件上的方法。每个源文件   包含类型或方法定义的一部分,所有部分都是   在编译应用程序时合并。

首先,您应该考虑使用加法运算符是否是概念上的好选择。 结果对象的显而易见性是什么?

乍一看,我会通过使用所有非空值来解释您正在寻找的行为。当两个对象具有非空值的相同字段时,您将如何处理它?<​​/ p>

考虑到这是您所追求的行为,您可以将加法运算符重载为in Gabe's answer。当您的类/结构只包含可空值时,您可以让添加将所有值从一个对象复制到另一个对象,其中一个包含值,另一个包含null值。当两个对象都包含值时,我会抛出异常。

作为最后一点,请反思您最终必须如何实施此行为。我猜你可以解决一个底层设计问题您可能不应该使用仅存储部分数据的对象。


作为另一种选择,C#中的新dynamic keyword也会浮现在脑海中。也可能值得检查一下。