2010-08-24 2 views
2

Как можно объединить члены экземпляров двух или более анонимных (или, возможно, анонимных) типов, чтобы создать результирующий экземпляр типа со всеми членами?Создать объединение членов анонимных типов

ПСЕВДОКОДА пример:

var anon1 = new {FirstName = "Bill"}; 
var anon2 = new {Surname = "Hicks"}; 
var anon3 = anon1.Union(anon2); 

Debug.WriteLine(anon3.FirstName + " " + anon3.Surname); 

Выхода: «Билл Хикс»

ответ

5

компилятор знает только о анонимном типе в рамках методы он объявлен, так что нет, вы не можете сделать что-то подобное. (Конечно, вы можете передать его, но тогда он будет набран как объект).

Вы можете объявить новый анонимный тип с обоими свойствами, но это, вероятно, не то, что вы хотите:

var anon3 = new { anon1.FirstName, anon2.Surname }; 

можно имитировать то, что вы хотите с помощью C# 4 в dynamic конструкцию, но затем возвращение Значение от Союза будет dynamic, а не сильным.

Редактировать в ответ на ваш комментарий:

Вот пример того, как можно реализовать метод Union, если вы хотите использовать dynamic

public static class AnonymousTypeExtension 
{ 
    public static dynamic Union(this object first, params object [] others) 
    { 
     var allObjects = new[] {first}.Concat(others); 
     var allProperties = allObjects.SelectMany(o => o.GetType().GetProperties(), 
          (o, p) => new {p.Name, Value = p.GetValue(o, null)}); 

     IDictionary<string,object> expando = new ExpandoObject(); 
     foreach(var property in allProperties.Where(p => !expando.ContainsKey(p.Name))) 
      expando.Add(property.Name,property.Value); 
     return expando; 
    } 
} 

Это сделает ваш пример кода работы, с маленькое завихрение, что результат конкатенации строк также будет набираться динамически, что не является допустимым входом для Debug.WriteLine. Это означает, что вам нужно будет сказать компилятору, чтобы он сначала рассматривал его как строку (возможно, не проблема в вашем фактическом сценарии использования):

 var anon1 = new { FirstName = "Bill" }; 
     var anon2 = new { Surname = "Hicks" }; 
     var anon3 = anon1.Union(anon2); 
     string name = anon3.FirstName + " " + anon3.Surname; 
     Debug.WriteLine(name); 
+0

Спасибо. Я буду исследовать использование ** dynamic **, так как результат объединения не должен быть сильным. – ProfK

+0

Красивый «динамический» урок, спасибо, очень. – ProfK

+0

Это потрясающий пример – klumsy

Смежные вопросы