如何扩展匿名类的对象

时间:2010-12-21 19:58:01

标签: c# anonymous-class

我有课堂方法:

public object MyMethod(object obj)
{
   // I want to add some new properties example "AddedProperty = true"
   // What must be here?
   // ...

   return extendedObject;
}

var extendedObject = this.MyMethod( new {
   FirstProperty = "abcd",
   SecondProperty = 100 
});

现在,extendedObject具有新属性。请帮助。

3 个答案:

答案 0 :(得分:12)

你做不到。

如果您想要一个可以在运行时添加成员的动态类型,那么您可以使用ExpandoObject

  

表示一个对象,其成员可以在运行时动态添加和删除。

这需要.NET 4.0或更高版本。

答案 1 :(得分:1)

您可以使用Dictionary(属性,值),或者如果您使用的是c#4.0,则可以使用新的动态对象(ExpandoObject)。

http://msdn.microsoft.com/en-us/library/dd264736.aspx

答案 2 :(得分:1)

您是否在编译时知道属性的名称?因为你可以这样做:

public static T CastByExample<T>(object o, T example) {
    return (T)o;
}

public static object MyMethod(object obj) {
    var example = new { FirstProperty = "abcd", SecondProperty = 100 };
    var casted = CastByExample(obj, example);

    return new {
        FirstProperty = casted.FirstProperty,
        SecondProperty = casted.SecondProperty,
        AddedProperty = true
    };
}

然后:

var extendedObject = MyMethod(
    new {
        FirstProperty = "abcd",
        SecondProperty = 100
    }
);

var casted = CastByExample(
    extendedObject,
    new {
        FirstProperty = "abcd",
        SecondProperty = 100,
        AddedProperty = true 
    }
);
Console.WriteLine(xyz.AddedProperty);

请注意,这在很大程度上依赖于同一个程序集中的两个匿名类型具有相同类型的相同类型的相同名称的属性。

但是,如果你要这样做,为什么不只是制作具体类型呢?

输出:

True