讓我們先從一類定義爲例子來說:聯盟基於其成員的平等兩個物體
public class Person
{
public string FirstName;
public string LastName;
public int Age;
public int Grade;
}
現在讓我們假設我有一個包含3個對象List<Person>
稱爲people
:
{"Robby", "Goki", 12, 8}
{"Bobby", "Goki", 10, 8}
{"Sobby", "Goki", 10, 8}
我正在尋找一些方法來檢索以下單Person
對象:
{null, "Goki", -1, 8}
其中在所有對象中相同的字段保留其值,而具有多個值的字段被替換爲某個無效的值。
我首先想到的組成如下:
Person unionMan = new Person();
if (people.Select(p => p.FirstName).Distinct().Count() == 1)
unionMan.FirstName = people[0].FirstName;
if (people.Select(p => p.LastName).Distinct().Count() == 1)
unionMan.LastName = people[0].LastName;
if (people.Select(p => p.Age).Distinct().Count() == 1)
unionMan.Age = people[0].Age;
if (people.Select(p => p.Grade).Distinct().Count() == 1)
unionMan.Grade = people[0].Grade;
遺憾的是,真正的業務對象有超過四許多更多的成員,這是既繁瑣的編寫和壓倒別人看到的第一次。
我也算是某種方式利用反射的把這些重複檢查和分配在一個循環:
string[] members = new string[] { "FirstName", "LastName", "Age", "Grade" };
foreach (string member in members)
{
if (people.Select(p => p.**member**).Distinct().Count() == 1)
unionMan.**member** = people[0].**member**;
}
其中** 成員 **將然而反射將允許檢索和存儲該特定成員(假設可能)。
雖然第一個解決方案可以工作,而第二個我假設可以工作,但沒有人有更好的替代解決方案來解決這個問題嗎?如果沒有,如上所述使用反射是可行的嗎?
好,你的第二個想法應該工作,但不是顯示的代碼!順便說一句,你應該有一個Person的默認構造函數與你的「無效」值。 – 2012-08-02 20:27:32