从继承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());
我有一种情况需要在 属性 上获取应用于 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());