对不起,我正在文档中查找System.Type类型和PropertyInfo类型,但是我似乎找不到我需要的东西。
如何判断属性(或方法或任何其他成员)是否在其声明类中声明为virtual?
例如
class Cat
{
public string Name { get; set; }
public virtual int Age { get; set; }
}如何判断Age属性是否被声明为virtual?
发布于 2010-11-22 16:23:46
您可以使用IsVirtual属性:
var isVirtual = typeof(Cat).GetProperty("Age").GetGetMethod().IsVirtual;发布于 2010-11-22 16:24:48
从技术上讲,属性不是虚拟的--它们的访问器是虚拟的。试试这个:
typeof(Cat).GetProperty("Age").GetAccessors()[0].IsVirtual如果需要,可以使用如下所示的扩展方法来确定属性是否为虚拟属性:
public static bool? IsVirtual(this PropertyInfo self)
{
if (self == null)
throw new ArgumentNullException("self");
bool? found = null;
foreach (MethodInfo method in self.GetAccessors()) {
if (found.HasValue) {
if (found.Value != method.IsVirtual)
return null;
} else {
found = method.IsVirtual;
}
}
return found;
}如果返回null,则要么该属性没有访问器(这种情况永远不会发生),要么所有属性访问器都不具有相同的虚拟状态--至少有一个是虚拟的,而另一个不是虚拟的。
发布于 2019-10-31 21:49:11
单独的IsVirtual对我不起作用。它告诉我,我所有的非虚拟不可空属性都是虚拟的。我不得不使用IsFinal和IsVirtual的组合
这是我最终得到的结论:
PropertyInfo[] nonVirtualProperties = myType.GetProperties().Where(x => x.GetAccessors()[0].IsFinal || !x.GetAccessors()[0].IsVirtual).ToArray();
PropertyInfo[] virtualProperties = myType.GetProperties().Where(x => !x.GetAccessors()[0].IsFinal && x.GetAccessors()[0].IsVirtual).ToArray();https://stackoverflow.com/questions/4243541
复制相似问题