从继承class获取属性信息,在静态函数中

Get attribute information from inheriting class, inside static function

我有一种情况需要在 属性 上获取应用于 class 的属性(装饰器)的值。装饰的 class 继承自抽象 class。就是这个抽象class需要获取属性信息,但是需要在一个静态函数内部进行

我无法 post 确切的场景,但这是一个糟糕的例子,没有属性也可以,但请按原样使用它:

public class VehicleShapeAttribute : Attribute
{
    public string Shape { get; }
    public VehicleShapeAttribute(string shape)
    {
        Shape = shape;
    }
}

public abstract class Vehicle
{
    public string Brand { get; set; }
    public string Model { get; set; }
    public string Colour { get; set; }

    public static string GetVehicleShape()
    {
        //return value from the attribute, from this static function. CANT DO THIS HERE
        return AnyInheritingClass.VehicleShapeAttribute.Shape;
    }
}

[VehicleShape("sedan")]
public class VauxhaulAstraSedan : Vehicle
{
    //calling GetVehicleShape() on this class should automatically return "sedan"
}

这可能吗?

这是一个糟糕的例子,但我无法post实际代码

使方法成为非静态方法并使用 this.GetType():

解析运行时类型
public abstract class Vehicle
{
    public string Brand { get; set; }
    public string Model { get; set; }
    public string Colour { get; set; }

    public string GetVehicleShape()
    {
        var attribute = Attribute.GetCustomAttribute(this.GetType(), typeof(VehicleShapeAttribute)) as VehicleShapeAttribute;

        if(attribute is VehicleShapeAttribute){
            return attribute.Shape;
        }

        return null;
    }
}

对于静态版本,您需要接受一个 Vehicle 参数,然后您可以检查其类型:

public static string GetVehicleShape(Vehicle vehicle)
{
    var attribute = Attribute.GetCustomAttribute(vehicle.GetType());
    // ...

或者(我只是 copy/pasting Mathias 的代码在语法上是另一种形式)如果你真的需要方法 static 因为你不想创建一个实例,您可以将以下方法添加到您的属性代码(或任何其他静态 class,但我喜欢将其与属性一起放在那儿):

public static string GetFrom<T>()
{
    return GetFrom(typeof(T));
}

public static string GetFrom(Type t)
{
    var attribute = Attribute.GetCustomAttribute(t, typeof(VehicleShapeAttribute)) as VehicleShapeAttribute;

    if(attribute is VehicleShapeAttribute){
        return attribute.Shape;
    }

    return null;
}

然后你可以这样写代码:

var shape = VehicleShapeAttribute.GetFrom<VauxhaulAstraSedan>();

var shape = VehicleShapeAttribute.GetFrom(typeof(VauxhaulAstraSedan));

甚至

var vehicle = new VauxhaulAstraSedan();
var shape = VehicleShapeAttribute.GetFrom(vehicle.GetType());