本文介绍了C#类可以继承其接口属性?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
此似乎暗示否。这是不幸的。
This would appear to imply "no". Which is unfortunate.
[AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class,
AllowMultiple = true, Inherited = true)]
public class CustomDescriptionAttribute : Attribute
{
public string Description { get; private set; }
public CustomDescriptionAttribute(string description)
{
Description = description;
}
}
[CustomDescription("IProjectController")]
public interface IProjectController
{
void Create(string projectName);
}
internal class ProjectController : IProjectController
{
public void Create(string projectName)
{
}
}
[TestFixture]
public class CustomDescriptionAttributeTests
{
[Test]
public void ProjectController_ShouldHaveCustomDescriptionAttribute()
{
Type type = typeof(ProjectController);
object[] attributes = type.GetCustomAttributes(
typeof(CustomDescriptionAttribute),
true);
// NUnit.Framework.AssertionException: Expected: 1 But was: 0
Assert.AreEqual(1, attributes.Length);
}
}
能否类继承的接口属性?还是我在这里找错了树?
Can a class inherit attributes from an interface? Or am I barking up the wrong tree here?
推荐答案
没有。每当实现一个接口或派生类中重写成员,则需要重新申报的属性。
No. Whenever implementing an interface or overriding members in a derived class, you need to re-declare the attributes.
如果你只关心ComponentModel(而不是直接反射),有一种方法(<$c$c>[AttributeProvider]$c$c>)这表明,从现有类型的属性(避免重复),但它仅适用于财产和索引的使用情况。
If you only care about ComponentModel (not direct reflection), there is a way ([AttributeProvider]
) of suggesting attributes from an existing type (to avoid duplication), but it is only valid for property and indexer usage.
作为一个例子:
using System;
using System.ComponentModel;
class Foo {
[AttributeProvider(typeof(IListSource))]
public object Bar { get; set; }
static void Main() {
var bar = TypeDescriptor.GetProperties(typeof(Foo))["Bar"];
foreach (Attribute attrib in bar.Attributes) {
Console.WriteLine(attrib);
}
}
}
输出:
System.SerializableAttribute
System.ComponentModel.AttributeProviderAttribute
System.ComponentModel.EditorAttribute
System.Runtime.InteropServices.ComVisibleAttribute
System.Runtime.InteropServices.ClassInterfaceAttribute
System.ComponentModel.TypeConverterAttribute
System.ComponentModel.MergablePropertyAttribute
这篇关于C#类可以继承其接口属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!