Как расширить объект анонимного класса - PullRequest
5 голосов
/ 21 декабря 2010

У меня есть метод класса:

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

Теперь расширенный объект имеет новые свойства.Помогите пожалуйста.

Ответы [ 3 ]

12 голосов
/ 21 декабря 2010

Вы не можете этого сделать.

Если вам нужен динамический тип, к которому вы можете добавлять элементы во время выполнения, вы можете использовать ExpandoObject.

Представляет объект, члены которого могутдинамически добавляться и удаляться во время выполнения.

Для этого требуется .NET 4.0 или более поздняя версия.

1 голос
/ 21 декабря 2010

Знаете ли вы во время компиляции имена свойств?Потому что вы можете сделать это:

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
1 голос
/ 21 декабря 2010

Вы можете использовать словарь (свойство, значение) или, если вы используете c # 4.0, вы можете использовать новый динамический объект (ExpandoObject).

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

...