.net - 创建匿名类型成员的联合

标签 .net anonymous-types

如何能够联合两个或多个匿名(或可能非匿名)类型的实例成员,以创建具有所有成员的结果类型实例?

伪代码示例:

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

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

输出是:“Bill Hicks”

最佳答案

编译器只知道它声明的方法中的匿名类型,所以不,你不能做这样的事情。 (当然,您可以传递它,但随后它将被键入为对象)。

您可以声明一个具有这两个属性的新匿名类型,但这可能不是您想要的:

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

可以使用 C#4 的 dynamic 构造来模仿您想要的内容,但 Union 的返回值将是 dynamic,而不是强类型。

编辑以回复您的评论:

这里是一个示例,说明如果您想利用动态,如何实现 Union 方法

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);

关于.net - 创建匿名类型成员的联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3559040/

相关文章:

c# - 在继承类中使用 ReactiveCommand 和 WhenAny

c - 匿名结构 + 复合文字导致 lint 错误

c# - 有没有办法从方法中返回匿名类型?

c# - 无法将匿名类型传递给泛型构造函数

.NET Framework 和 Visual Studio 安装顺序

.net - 给定以下代码,我应该编写哪些测试?

c# - 在与 KnownType 属性一起使用的类上使用 Obsolete 属性时如何忽略编译器警告

c# - 自定义 .NET 4.5 bundler /压缩器

c# - 如何在 C# 匿名类型中声明 "Key"字段?

c# - method ( new { x=y.property } ) 是什么意思?