1

出于某种原因,我没有得到这个。(下面的示例模型)如果我写:

var property = typeof(sedan).GetProperty("TurningRadius");
Attribute.GetCustomAttributes(property,typeof(MyAttribute), false)

尽管表明我不想搜索继承链,但调用将返回 MyAttribute(2)。有谁知道我可以编写什么代码以便调用

MagicAttributeSearcher(typeof(Sedan).GetProperty("TurningRadius"))

调用时不返回任何内容

MagicAttributeSearcher(typeof(Vehicle).GetProperty("TurningRadius"))

返回 MyAttribute(1)?


示例模型:

public class Sedan : Car
{
    // ...
}

public class Car : Vehicle
{
    [MyAttribute(2)]
    public override int TurningRadius { get; set; }
}

public abstract class Vehicle
{
    [MyAttribute(1)]
    public virtual int TurningRadius { get; set; }
}
4

3 回答 3

4

好的,鉴于额外的信息 - 我相信问题在于GetProperty继承变化。

如果您将呼叫更改GetProperty为:

PropertyInfo prop = type.GetProperty("TurningRadius",
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

prop如果该属性未被覆盖,则 then将为 null。例如:

static bool MagicAttributeSearcher(Type type)
{
    PropertyInfo prop = type.GetProperty("TurningRadius", BindingFlags.Instance | 
                                         BindingFlags.Public | BindingFlags.DeclaredOnly);

    if (prop == null)
    {
        return false;
    }
    var attr = Attribute.GetCustomAttribute(prop, typeof(MyAttribute), false);
    return attr != null;
}

这返回true并且仅在以下情况下:

  • 指定的类型覆盖TurningRadius属性(或声明一个新的)
  • 属性具有MyAttribute属性。
于 2008-11-09T18:26:19.833 回答
3

我认为问题在于,当您从第一行的 Sedan 对象中获取属性 TurningRadius

var property = typeof(sedan).GetProperty("TurningRadius");

您实际上得到的是在 Car 级别声明的 TurningRadius 属性,因为 Sedan 没有自己的重载。

因此,当您请求它的属性时,即使您请求不在继承链中上升,您也会得到在 car 中定义的属性,因为您要查询的属性是在 Car 中定义的属性。

您应该更改 GetProperty 以添加必要的标志以仅获取声明成员。我相信DeclaredOnly应该这样做。

编辑:请注意,此更改将使第一行返回 null,因此请注意 NullPointerExceptions。

于 2008-11-09T18:25:42.253 回答
1

我认为这就是您所追求的 - 请注意,我必须在 Vehicle 中使 TurningRadius 抽象并在 Car 中被覆盖。可以吗?

using System;
using System.Reflection;

public class MyAttribute : Attribute
{
    public MyAttribute(int x) {}
}

public class Sedan : Car
{
    // ...
}

public class Car : Vehicle
{
    public override int TurningRadius { get; set; }
}

public abstract class Vehicle
{
    [MyAttribute(1)]
    public virtual int TurningRadius { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        MagicAttributeSearcher(typeof(Sedan));
        MagicAttributeSearcher(typeof(Vehicle));
    }

    static void MagicAttributeSearcher(Type type)
    {
        PropertyInfo prop = type.GetProperty("TurningRadius");
        var attr = Attribute.GetCustomAttribute(prop, typeof(MyAttribute), false);
        Console.WriteLine("{0}: {1}", type, attr);
    }
}

输出:

Sedan:
Vehicle: MyAttribute
于 2008-11-07T23:35:39.663 回答