我试图确定派生类的属性值,当它通过基类参数传递到方法中时。
例如,下面的完整代码示例:
class Program
{
static void Main(string[] args)
{
DerivedClass DC = new DerivedClass();
ProcessMessage(DC);
}
private static void ProcessMessage(BaseClass baseClass)
{
Console.WriteLine(GetTargetSystemFromAttribute(baseClass));
Console.ReadLine();
}
private static string GetTargetSystemFromAttribute<T>(T msg)
{
TargetSystemAttribute TSAttribute = (TargetSystemAttribute)Attribute.GetCustomAttribute(typeof(T), typeof(TargetSystemAttribute));
if (TSAttribute == null)
throw new Exception(string.Format("Message type {0} has no TargetSystem attribute and/or the TargetSystemType property was not set.", typeof(T).ToString()));
return TSAttribute.TargetSystemType;
}
}
public class BaseClass
{}
[TargetSystem(TargetSystemType="OPSYS")]
public class DerivedClass : BaseClass
{}
[AttributeUsage(AttributeTargets.Class)]
public sealed class TargetSystemAttribute : Attribute
{
public string TargetSystemType { get; set; }
}
因此,在上面的示例中,我打算让通用GetTargetSystemFromAttribute方法返回“OPSYS”。
但是,因为 DerivedClass 实例已作为基类传递给ProcessMessage ,所以Attribute.GetAttribute没有找到任何东西,因为它将 DerivedClass 视为基类,它没有我感兴趣的属性或值。
在现实世界中有几十个派生类,所以我希望避免很多:
if (baseClass is DerivedClass)
...建议作为问题如何访问派生类实例的属性的答案,该派生类的实例以基类的形式作为参数传递(这与类似的问题有关,但具有属性)。我希望因为我对 Attributes 感兴趣,所以有更好的方法来做这件事,特别是因为我有几十个派生类。
所以,这就是问题所在。有什么方法可以在我的派生类上以低维护的方式获取 TargetSystem 属性的 TargetSystemType 值?