компилятор знает только о анонимном типе в рамках методы он объявлен, так что нет, вы не можете сделать что-то подобное. (Конечно, вы можете передать его, но тогда он будет набран как объект).
Вы можете объявить новый анонимный тип с обоими свойствами, но это, вероятно, не то, что вы хотите:
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);
Спасибо. Я буду исследовать использование ** dynamic **, так как результат объединения не должен быть сильным. – ProfK
Красивый «динамический» урок, спасибо, очень. – ProfK
Это потрясающий пример – klumsy