Вы можете избежать использования DynamicInvoke
, что мучительно медленно.Вы можете использовать вывод типа в C #, чтобы получить экземпляр вашего анонимного типа в общем.Что-то вроде:
public static Func<object[], T> AnonymousInstantiator<T>(T example)
{
var ctor = typeof(T).GetConstructors().First();
var paramExpr = Expression.Parameter(typeof(object[]));
return Expression.Lambda<Func<object[], T>>
(
Expression.New
(
ctor,
ctor.GetParameters().Select
(
(x, i) => Expression.Convert
(
Expression.ArrayIndex(paramExpr, Expression.Constant(i)),
x.ParameterType
)
)
), paramExpr).Compile();
}
Теперь вы можете вызывать,
var instantiator = AnonymousInstantiator(new { Name = default(string), Num = default(int) });
var a1 = instantiator(new object[] { "abc", 123 }); // strongly typed
var a2 = instantiator(new object[] { "xyz", 789 }); // strongly typed
// etc.
Вы можете использовать метод AnonymousInstantiator
для генерации функций для создания экземпляров любого анонимного типа с любым количеством свойств, простоВы должны сначала пройти соответствующий пример.Входные параметры должны быть переданы как массив объектов.Если вы беспокоитесь о производительности бокса, то вам нужно написать собственный экземпляр, который принимает только string
и int
в качестве входных параметров, но использование такого экземпляра будет немного более ограниченным.