Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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
你能在C#中得到一个类的合并属性吗?_C#_.net_Oop_Inheritance_Attributes - Fatal编程技术网

你能在C#中得到一个类的合并属性吗?

你能在C#中得到一个类的合并属性吗?,c#,.net,oop,inheritance,attributes,C#,.net,Oop,Inheritance,Attributes,假设我有以下一组类,是否可以合并DerivedClass的属性?当前,如果我使用GetType().GetCustomAttributes()方法为继承传递true,它将接受继承结构中最高的属性 i、 e.[另一个(“鲍勃”)]和[My(16)] 属性是否可以合并?因此,我最终会得到两个属性[My(16,“男性”)]和[Other(“Bob”)] 我的意思不是说我会指定一个属性[My(16,“Male”)],而是返回一个属性,该属性的年龄为16岁,性别为男性 public class MyAtt

假设我有以下一组类,是否可以合并DerivedClass的属性?当前,如果我使用GetType().GetCustomAttributes()方法为继承传递true,它将接受继承结构中最高的属性

i、 e.[另一个(“鲍勃”)]和[My(16)]

属性是否可以合并?因此,我最终会得到两个属性[My(16,“男性”)]和[Other(“Bob”)]

我的意思不是说我会指定一个属性[My(16,“Male”)],而是返回一个属性,该属性的年龄为16岁,性别为男性

public class MyAttribute : Attribute
{

    public MyAttribute(int age)
    {
        Age = age;
    }

    public MyAttribute(int age, string gender)
    {
        Age = age;
        Gender = gender;
    }

    public int Age { get; set; }

    public string Gender { get; set; }

}

public class AnotherAttribute : Attribute
{

    public AnotherAttribute(string name)
    {
        Name = name;
    }

    public string Name { get; set; }

}

[My(12, "Male")]
[Another("Bob")]
public class BaseClass
{
}

[My(16)]
public class DerivedClass : BaseClass
{
}

一个实体上可以有同一属性的多个实例(这是应用于属性的
AttributeUsageAttribute
上的一个选项)。获取类型的属性时,可以获取应用于继承链的所有属性

但是,在标准工具中,没有任何东西可以获取两个属性实例并生成一个属性实例


(理论上,重新编写MSIL的后处理器可以做到这一点。)

首先,我不相信您所询问的任何行为都会依赖于
AttributeUsage
属性,它应该装饰您的属性类(看起来我可能错了)。我也看不到任何属性会在哪里被合并。每个属性都是类本身的表示形式。每个属性类都应该返回自己的数据。我希望
DerivedClass.GetCustomAttributes()
为每个属性返回三个单独的引用-基类返回2个,自身返回1个

尝试将“MyAttribute”上的AttributeUsage设置为允许多个。它可能不是合并它们,而是获取属性的“最新”版本

我只是想到了另一个可能导致神秘失踪的原因。您可能需要跟随
基本类
才能获得原始属性?你可以试试:

base.GetType().GetCustomAttributes();
我做了一些挖掘,下面是
AttibuteUsage
将要做的事情,可能会导致您只看到
MyAttribute
类中的一个:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]

在我之前关于使用
AttributeUsage
的声明中,我的发言非常接近;但是,
继承的
命名参数将限制基类“
MyAttribute”的可见性。尝试指定
Inherited=true
并查看您得到的结果。

您不需要将属性标记为“允许多个”来实现这一点吗?@Craig:更新了我的答案,可能会为您提供更多信息。GetCustomAttributes只返回两个属性。BaseClass中的另一个属性和DerivedClass中的MyAttribute。我希望有3个类可以让我自己合并属性。谢谢Richard,这让我更接近了。我希望能够得到所有的属性,然后自己合并它们,但有点困惑,因为我只有2个属性回来,所以我甚至不能合并自己!