Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 创建匿名类型成员的联合_.net_Anonymous Types - Fatal编程技术网

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

.net 创建匿名类型成员的联合,.net,anonymous-types,.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 anon1 = new {FirstName = "Bill"};
var anon2 = new {Surname = "Hicks"};
var anon3 = anon1.Union(anon2);

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

输出是:“Bill Hicks”

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

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

var anon3 = new  { anon1.FirstName, anon2.Surname };
可以使用C#4的
动态
构造来模拟您想要的内容,但是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;
    }
}

谢谢我将研究动态的使用,因为联合结果不一定是强类型。这是一个很棒的例子
        var anon1 = new { FirstName = "Bill" };
        var anon2 = new { Surname = "Hicks" };
        var anon3 = anon1.Union(anon2);
        string name = anon3.FirstName + " " + anon3.Surname;
        Debug.WriteLine(name);