Я думаю, вам было бы лучше использовать что-то вроде Tuple<int, string>
здесь, а не анонимный тип, но можно делать то, что вы хотите.Два анонимных типа в одной сборке, которые имеют одинаковые имена полей и типы полей в одном и том же порядке, внутренне «складываются» в один тип.Вы можете использовать это для передачи экземпляров анонимного типа и, используя обобщенный вывод типа, типизировать их позднее.
Обратите внимание, что это зависит от внутреннего механизма в компиляторе C #, поэтому нет гарантии, что он продолжит работать;однако это работает в каждой текущей версии C #, которая имеет анонимные типы.
Обновление: это на самом деле явно вызывается в спецификации C #, поэтому это должно быть абсолютно безопасно:
В одной и той же программе два инициализатора анонимных объектов, которые задают последовательность свойств с одинаковыми именами и типами в одном и том же порядке, будут создавать экземпляры одного и того же анонимного типа
Также обратите вниманиечто это работает только в пределах одной сборки (не позволяйте ссылке спецификации на "программу" сбить вас с толку).Потребление анонимных типов из другой сборки требует рефлексии (и, как правило, IMO - очень плохая идея). Однако для таких сценариев привязки данных, как у вас, он работает нормально.
public object foo;
public void Create()
{
this.foo = new { Id = 1, Name = "Melvin" };
}
public void Consume()
{
var x = new { Id = 0, Name = String.Empty };
var y = this.Cast(this.foo, x);
}
public T Cast<T> ( object o, T template )
{
return (T)o;
}