gpt4 book ai didi

c# - List 除了 List 不工作

转载 作者:太空宇宙 更新时间:2023-11-03 21:03:58 25 4
gpt4 key购买 nike

我正在制作一个辅助方法,它会自动为给定实体(类)的属性设置随机值,这样我就不必在测试时为每个属性填充一个值。

在我的例子中,每个实体都继承自 BaseEntity 类,该类具有 ID、CreatedBy、CreatedOn 等...属性。基本上这个类具有所有实体共享的所有属性。

我在这里试图完成的是将独特的属性与常见的属性分开。

这是我的代码:

public static TEntity PopulateProperties<TEntity>(TEntity entity)
{
try
{
// Since every entity inherits from EntityBase, there is no need to populate properties that are in EntityBase class
// because the Core project populates them.
// First of all, we need to get all the properties of EntityBase
// and then exlude them from the list of properties we will automatically populate

// Get all properties of EntityBase
EntityBase entityBase = new EntityBase();
List<PropertyInfo> entityBaseProperties = new List<PropertyInfo>();
foreach (var property in entityBase.GetType().GetProperties())
{
entityBaseProperties.Add(property);
}

// Get all properties of our entity
List<PropertyInfo> ourEntityProperties = new List<PropertyInfo>();
foreach (var property in entity.GetType().GetProperties())
{
ourEntityProperties.Add(property);
}

// Get only the properties related to our entity
var propertiesToPopulate = ourEntityProperties.Except(entityBaseProperties).ToList();

// Now we can loop throught the properties and set values to each property
foreach (var property in propertiesToPopulate)
{
// Switch statement can't be used in this case, so we will use the if clause
if (property.PropertyType == typeof(string))
{
property.SetValue(entity, "GeneratedString");
}
else if (property.PropertyType == typeof(int))
{
property.SetValue(entity, 1994);
}
}

return entity;
}
finally
{
}
}

问题在于 var propertiesToPopulate = entityBaseProperties.Except(ourEntityProperties).ToList();

我期待的是一个 PropertyInfo 对象的列表,这些对象只对该实体是唯一的,但是我总是得到我的实体的所有属性。此行未按预期过滤列表。

有什么帮助吗??

最佳答案

PropertyInfo“知道”您曾要求它的类型。例如:

using System;
using System.Reflection;

class Base
{
public int Foo { get; set; }
}

class Child : Base
{
}

class Test
{
static void Main()
{
var baseProp = typeof(Base).GetProperty("Foo");
var childProp = typeof(Child).GetProperty("Foo");
Console.WriteLine(baseProp.Equals(childProp));
Console.WriteLine(baseProp.ReflectedType);
Console.WriteLine(childProp.ReflectedType);
}
}

输出为:

False
Base
Child

幸运的是,你可以更简单地做到这一点 - 如果你只是想知道在 TEntity 中声明了哪些属性,你可以使用:

var props = typeof(entity.GetType()).GetProperties(BindingFlags.Instance | 
BindingFlags.Public |
BindingFlags.DeclaredOnly);

如果您还需要静态属性,请进行调整。重要的一点是 BindingFlags.DeclaredOnly

关于c# - List<PropertyInfo> 除了 List<PropertyInfo> 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42534855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com