假设我有一个声明为给定基类的实例变量。我想找到该对象实际上是什么原始的、最高层次的类型,而不是基类。我该怎么做?
我有一个验证属性,类似于PostSharp,因此反射命中在编译时,并且由于
为了提供上下文,我有一个基本的
本质上,我想将我的验证集中在基类上,因为所有派生类的验证模式都是相同的。但是,派生类中的值可能会改变,我需要进行一些边界检查。
编辑:让我们添加一些代码。
我有一个验证属性,类似于PostSharp,因此反射命中在编译时,并且由于
CompileTimeValidation
方法,因此是无意义的。我只是不知道该如何去做。扫描IsSubclassOf
并没有帮助,因为我会得到多个错误的结果。为了提供上下文,我有一个基本的
Entity
类型。我从这个类型派生出定义各种Entity
类型的所有内容。我使用策略属性对这些类型(包括基本的Entity
)进行装饰。PostSharp方面在编译时验证某些策略约束。我想能够只对基本的Entity
类型进行方面验证,以便验证Entity
和它的所有派生类型。我可以看到验证已经发生。但是,它被处理为一个Entity
,而不是DerivedEntity
。为了评估DerviedEntity
上的策略,我需要专门装饰那个类。如果可能的话,我不想这样做,只想装饰Entity
。本质上,我想将我的验证集中在基类上,因为所有派生类的验证模式都是相同的。但是,派生类中的值可能会改变,我需要进行一些边界检查。
编辑:让我们添加一些代码。
[EnforceMaxLifetimePolicy]
[LifetimePolicy]
public class Entity<T>
{
public string Key { get; set; }
public T Object { get; set; }
public TimeSpan EntityLifetime
{
get
{
var lifetimePolicy =
Attribute.GetCustomAttribute(GetType(), typeof(LifetimePolicyAttribute)) as LifetimePolicyAttribute;
return new TimeSpan(lifetimePolicy.Hours, lifetimePolicy.Minutes, 0);
}
}
}
[Serializable]
[AttributeUsage(AttributeTargets.Class)]
internal class LifetimePolicyAttribute : Attribute
{
public readonly short Hours;
public readonly short Minutes;
public LifetimePolicyAttribute(short hours, short minutes)
{
Hours = hours;
Minutes = minutes;
}
public LifetimePolicyAttribute()
{
Minutes = 1;
}
}
[Serializable]
[AttributeUsage(AttributeTargets.Class)]
internal class EnforceMaxLifetimePolicyAttribute : OnMethodBoundaryAspect
{
public override bool CompileTimeValidate(MethodBase method)
{
var type = method.GetType();
var lifetimePolicy = GetCustomAttribute(type, typeof(LifetimePolicyAttribute)) as LifetimePolicyAttribute;
if (lifetimePolicy != null && lifetimePolicy.Hours + lifetimePolicy.Minutes / 60 > 24)
{
throw new InvalidAnnotationException($"Lifetimes can not exceed 24 hours. The lifetime on {type.FullName} is invalid.");
}
return true;
}
}
[LifetimePolicy(hours: 24, minutes: 0)]
internal class ShoppingCartEntity : Entity<ShoppingCart>
{
}
正如你所看到的,ShoppingCartEntity没有[EnforceMaxLifetimePolicy]
。它在基类Entity
上。然而,我仍希望Enforce属性实体也适用于派生类型,这就是为什么我将Inherited
标志保留为默认值(true)。
obj.GetType()
对你有用吗? - Andreiobject
:) - Ilya Chernomordik