如何解决C# - 从 PropertyInfo 创建完整的动态表达式树
- Create Expression from PropertyInfo
- Dynamically Create Expression from PropertyInfo
- 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 举报,一经查实,本站将立刻删除。