C# 使用属性进行反射优化。
在C#中有没有办法:C# 使用属性进行反射优化。,c#,reflection,attributes,C#,Reflection,Attributes,在C#中有没有办法: 获取具有属性的类的所有属性(而不是必须遍历所有属性,然后检查属性是否存在) 如果我想要所有公共、内部和受保护的属性,但不想要私有属性,我找不到这样做的方法。我只能这样做: PropertyInfo[]props=type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) 有没有办法避免得到私人财产,但要得到其他一切。我认为没有办法做到这两个 但是,您需要考虑
有没有办法避免得到私人财产,但要得到其他一切。我认为没有办法做到这两个 但是,您需要考虑多少类型?这真的是一个瓶颈吗?您是否能够缓存结果以避免每个类型重复执行一次以上操作?响应(2):如果您在所讨论的类/程序集之外,
内部
和受保护
与私有
相同
如果你想访问这些属性,你需要像已经做的那样请求所有属性,然后自己过滤列表。关于缓存:如果你通过
TypeDescriptor.GetProperties
访问属性,那么你就可以免费获得缓存。TypeDescriptor
类还有一些很好的实用方法用于反射情况ns是这样的。它只在公共属性上运行(没有受保护的或内部成员,也没有字段)。实际上没有更快的方法,但可以做的是通过缓存数据来减少操作的频率。通用实用程序类可以是一种方便的方法,例如:
static class PropertyCache<T>
{
private static SomeCacheType cache;
public static SomeCacheType Cache
{
get
{
if (cache == null) Build();
return cache;
}
}
static void Build()
{
/// populate "cache"
}
}
静态类属性缓存
{
私有静态SomeCacheType缓存;
公共静态SomeCacheType缓存
{
得到
{
if(cache==null)Build();
返回缓存;
}
}
静态void Build()
{
///填充“缓存”
}
}
然后,您的PropertyCache.Cache具有仅用于Foo等的数据-具有惰性填充。如果愿意,您也可以使用静态构造函数。Private properties?属性的目的是公开您的私有实例字段。不确定为什么您首先需要私有属性。我不需要私有属性。这就是问题所在TypeDescriptor的缓存实际上相当有限,部分原因是它必须处理扩展属性之类的场景。