在C#中,属性的属性继承失败 - c#

我有以下属性,其中Inherited设置为true。

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method, Inherited = true)]
public class InheritedAttribute : Attribute { }

DerivedA类包含一个属性,该属性使用[InheritedAttribute]标记覆盖BaseA的虚拟属性。

public class BaseA
{
    [InheritedAttribute]
    public virtual int prop { get; set; }
}

public class DerivedA : BaseA
{
    public override int prop { get; set; }
}

不幸的是,在DerivedA.prop上找不到该属性,因此该属性尚未继承到child属性。

public static void Main()
{
    var propertyInfo = typeof(DerivedA).GetProperties()[0];
    // propertyInfo.CustomAttributes is empty
    // propertyInfo.GetCustomAttributes(true) is empty
}

如果将属性放在方法而不是属性上(如example code on microsoft's website中所示),则该属性将按预期继承,并且可以在methodInfo.CustomAttributes中找到。

是否仅在属性上不允许属性继承?还是我完全想念其他东西?

参考方案

发生这种情况的原因是,根据MSDN规范,GetCustomAttributes方法忽略了属性和事件的inherit参数。实际上,您的属性具有此属性,可以按照建议通过调用Attribute.GetCustomAttributes方法进行检查

var propertyInfo = typeof(DerivedA).GetProperties()[0];
var attributes = Attribute.GetCustomAttributes(propertyInfo);

在C#.Net中找到工作项目目录 - c#

我用过Directory.getCurrentDirectory();它只给C:\ Windows \ SysWOW64但是我需要获取Visual Studio默认项目文件夹,我该如何获取?例如:C:\ Users \ knallasi \ Documents \ Visual Studio 2010 \ Projects \ SampleApp我们如何在项…

在C#中实现Comet服务器 - c#

我想知道是否可以用C#编写彗星服务器。我有一个C#代码,可以定期生成数据,我想将这些数据推送到Java应用程序。所以想将我的C#代码转换为彗星服务器。还想知道是否有实现的彗星服务器,使我们可以将C#应用程序和java应用程序连接到它,以便C#应用程序可以通过彗星服务器将信息传递给java应用程序。数据推送频率会很高,但是单个消息的大小非常小:字符串值。 参考…

在C#中,基本构造函数调用中的一种用法如何解决多个枚举警告? - c#

以下代码向我警告了IEnumerable可能的多个枚举:public ClassName(IEnumerable<OtherClassName> models) : base(models) { _models.AddRange(models); } 由于“基本”调用,消除此警告的常规解决方案不起作用。我无法转换为列表,因为没有地方可以存储该列表…

在C#中,如果关联的catch块引发异常,是否可以强制控制通过finally块? - c#

我知道在Java中,如果catch子句捕获了异常,并且其catch块引发了异常,则控制将在线程终止之前传递与关联的finally块(如果有)。但是,在C#中似乎并非如此。可以通过在try-catch语句的try块中放入try-finally语句和引发异常的catch块,来在C#中几乎反映出这种行为,但是,例如,如果finally块应该包含处理应记录异常的St…

字段初始化程序访问“this”:在C#中无效,在Java中有效? - c#

Improve this question 一,简介:这段代码:class C { int i = 5; byte[] s = new byte[i]; } 无法编译,并出现以下错误: 字段初始值设定项不能引用非静态字段,方法或属性“C.i”Resharper说类似的话:无法在静态上下文中访问非静态字段i。这与C# spec says一致-字段初始值设定项无…