我定义了一个类:
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;
答案 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也会浮现在脑海中。也可能值得检查一下。