如果您可以从某个基类派生所有可分类,那么您可以尝试在该基类中存储修饰符并使其信息可恢复。以下是保证包含一些错误的示例代码,但您可以明白。
public class Decorable
{
Dictionary<Type,object> decors = new Dictionary<Type,object>();
public void AddDecorator<D>(D decor) { decors[typeof(D)] = decor; }
public D GetDecorator<D>()
{
object value;
if (decors.TryGetValue(typeof(D), out value))
return (D)value;
else
return default(D);
}
}
public class Decorator<T> where T: class, Decorable
{
private readonly T _instance;
public Decorator(T instance)
{
_instance = instance;
instance.AddDecorator(this);
}
public T Instance
{
get { return _instance; }
}
public object AdditionalInformation { get; set; }
}
// use it like this
Decorator<MyClass> myDecor = myObj.GetDecorator<Decorator<MyClass>>();
如果您无法派生,那么您必须将信息存储在某个静态类中。但是,正如wcoenen所评论的那样,您需要清除该信息,否则您会发生内存泄漏。清算很容易出错,并不总是可能的,所以最好采用第一种方法。例如(不是线程安全的,你必须添加锁,如果你打算在多线程应用程序使用它):
static public class Decorators
{
static Dictionary<object,Dictionary<Type,object>> instance = new Dictionary<object,Dictionary<Type,object>>();
public static void AddDecorator<T,D>(this T obj, D decor)
{
Dictionary<Type,object> d;
if (!instance.TryGetValue(obj, out d))
{
d = new Dictionary<Type,object>();
instance.Add(obj, d);
}
d[typeof(D)]=decor;
}
public static D GetDecorator<T,D>(this T obj)
{
// here must be double TryGetValue, but I leave it to you to add it
return (D) instance[obj][typeof(D)];
}
public static T ClearDecorators(this T obj) { instance.remove(obj); }
}
// Decorator<T> code stays the same, but without type constraint
类似的问题:http://stackoverflow.com/questions/1420581/inheritance-on-a-constrained -generic-type-parameter – 2009-11-07 23:44:40
好吧,那种!我正在寻找一种方法来使这个通用装饰器,而不是知道为什么泛型基类是不可能的。 – Mouk 2009-11-08 00:03:24