C# - 从 PropertyInfo 创建完整的动态表达式树

问题描述

我已经浏览过以下链接,但似乎没有一个能回答我的问题-

  1. Create Expression from PropertyInfo
  2. Dynamically Create Expression from PropertyInfo
  3. Creating dynamically Expression<Func<T,Y>>

基本上我今天早些时候问了 this 个问题,abdusco评论帮助我通过以下方式解决它-

protected override void OnModelCreating(ModelBuilder builder)
{
    //Remove pluralizing table name convention (Install package - Microsoft.EntityFrameworkCore.Relational)
    foreach (var entity in builder.Model.GetEntityTypes())
    {
        entity.SetTableName(entity.displayName());
    }

    // Following properties belongs to User.cs and are non-public (internal).
    builder.Entity<User>().Property(x => x.FirstName);
    builder.Entity<User>().Property(x => x.MiddleName);
    builder.Entity<User>().Property(x => x.LastName);
    builder.Entity<User>().Property(x => x.EmailId);
    builder.Entity<User>().Property(x => x.DateOfBirth);

    base.OnModelCreating(builder);
}

但是我相信上面提到的方法会非常麻烦,因为在命名空间中会有几个类似于 User.cs 的类:Components.User.Persistance.Poco。 我现在正在尝试按如下方式实现上述解决方案-

private void AddNonPublicPropertiesToTheModel()
{
    // I have hard-coded the namespace for Now,but it will be supplied as a parameter.
    var types = GetAllMembersOfNamespaceOfExecutingAssembly("Components.User.Persistance.Poco");
    foreach (var type in types)
    {
        foreach (var propertyInfo in GetNonPublicInstancePropertyInfo(type))
        {
            var parameter = Expression.Parameter(type);
            var property = Expression.Property(parameter,propertyInfo);
            var conversion = Expression.Convert(property,typeof(object));
            //var lambda = Expression.Lambda<Func<,object>>
        }
    }
}

private static PropertyInfo[] GetNonPublicInstancePropertyInfo(Type type) =>
    type.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance);

private static Type[] GetAllMembersOfNamespaceOfExecutingAssembly(string namespaceName) =>
    GetAllMembersOfNamespace(namespaceName,Assembly.GetExecutingAssembly());

private static Type[] GetAllMembersOfNamespace(string namespaceName,Assembly assembly) =>
    assembly
        .GetTypes()
        .Where(type => string.Equals(type.Namespace,namespaceName,StringComparison.Ordinal))
        .ToArray();

问题- 如何使用所有这些反射生成 - builder.Entity<User>().Property(x => x.FirstName);? 或者,如果您有更好的方法,请随时分享
注意:-请仔细阅读以下 question 以更广泛地了解我正在努力实现的目标。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)