Я пытаюсь сгенерировать динамическую лямбду, используя анонимный класс, однако у меня возникает проблема, когда я пытаюсь связать свойство с моей моделью в анонимном классе.
public class Program
{
public class Model
{
public string Folder { get; set; }
}
public static void Main()
{
Select<Model>(new string[] { "Folder" });
}
public static void Select<TResult>(string[] propertyNames)
{
var anonymousType = CreateAnonymousType(propertyNames);
var parameter = Expression.Parameter(anonymousType, "item");
foreach (var prop in parameter.GetType().GetProperties())
Console.WriteLine(prop);
var bindings = propertyNames
.Select(name => name.Trim())
.Select(name => Expression.Bind(
typeof(TResult).GetProperty(name),
Expression.Property(parameter, name) // here I have the issue, when the method try to find the property "Folder" in the anonymou type, throw an exception.
));
var newT = Expression.MemberInit(Expression.New(typeof(TResult)), bindings);
var lambda = Expression.Lambda<Func<Type, TResult>>(newT, parameter);
Console.WriteLine(lambda.ToString());
}
public static Type CreateAnonymousType(string[] properties)
{
AssemblyName dynamicAssemblyName = new AssemblyName("TempAssembly");
AssemblyBuilder dynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(dynamicAssemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder dynamicModule = dynamicAssembly.DefineDynamicModule("TempAssembly");
TypeBuilder dynamicAnonymousType = dynamicModule.DefineType("AnonymousType", TypeAttributes.Public);
foreach (var property in properties)
dynamicAnonymousType.DefineField(property, typeof(object), FieldAttributes.Public);
return dynamicAnonymousType.CreateType();
}
}
Когда явыполнить код: Expression.Property(parameter, name)
выбросить это исключение:
Исключение во время выполнения (строка 23): свойство экземпляра 'Папка' не определено для типа 'System.RuntimeType'
Как я могу решить эту проблему?