Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何重写System.Type.GetProperties()?_.net_Reflection - Fatal编程技术网

.net 如何重写System.Type.GetProperties()?

.net 如何重写System.Type.GetProperties()?,.net,reflection,.net,Reflection,根据运行时确定的逻辑,我希望重写该方法以仅返回一个特定属性。例如,如果我有这个类: class A { public int PropertyOne { get; set; } public int PropertyTwo { get; set; } } 如果我打这个电话: var myProperties = typeof(A).GetProperties(); 我希望myProperties只包含一个PropertyInfo对象。此对象将包含有关A.PropertyOne

根据运行时确定的逻辑,我希望重写该方法以仅返回一个特定属性。例如,如果我有这个类:

class A
{
    public int PropertyOne { get; set; }
    public int PropertyTwo { get; set; }
}
如果我打这个电话:

var myProperties = typeof(A).GetProperties();
我希望
myProperties
只包含一个
PropertyInfo
对象。此对象将包含有关
A.PropertyOne
A.PropertyTwo
的信息,但不能同时包含这两个信息,具体取决于运行时逻辑

我试图创建一个从抽象的
System.type
派生的类型,并在派生类中重写
GetProperties()
。但是,我总是会遇到编译时错误:

“MyNamespace.MyClass.GetProperties()”:无法重写继承的成员“System.Type.GetProperties()”,因为它未标记为虚拟、抽象或重写


如何克服此错误并成功重写
GetProperties()

您注意到
System.Type
是抽象的,理论上,您可以从中派生并重写其抽象或虚拟方法。然而,在实践中,你几乎肯定不应该这样做。NET运行时会根据需要执行此操作

在C#(与Java相反)中,默认情况下方法不是虚拟的。您只能重写显式标记为
virtual
abstract
override
的方法,就像编译器错误所说的那样。在这种情况下,您可以重写,因为它是一个抽象方法。但是,重写该方法可能无法解决您的问题,而且您的重写方法在
typeof(A).GetProperties(BindingFlags attr)
中也不可用

您可能会发现其中一种方法更有用:

  • 改为调用的某个重载。例如,
    typeof(A).GetProperty(“PropertyOne”)
    将返回与
    A.PropertyOne
    对应的
    PropertyInfo
    对象
  • 如果
    GetProperty
    重载都不能满足您的需要,请像以前尝试的那样调用
    GetProperties()
    ,然后过滤结果。正常的Linq方法在
    PropertyInfo
    数组中可用,该数组返回
    GetProperties()

  • 你为什么要这么做?也许这是对堆栈溢出的欢迎!我试图编辑您的问题,以澄清您的问题,并提供更多细节。这些详细信息,例如实际的错误消息,可能会使搜索web的人更容易找到您的问题。我同意评论者的观点,即您可能没有试图解决正确的问题,但我将在稍后的答复中说明这一因素。如果我误解了你想问的问题,请编辑你的问题以澄清。