【发布时间】:2015-01-28 16:27:23
【问题描述】:
我有一个 Generic 类型,它用于在对象上提供一些要持久化的元数据:
public class PersistedElementDefinition<T> where T: IPersistedObject{
List<PersistedPropertyDefinition<T>> PropertiesToPersist {get;set;}
}
public class PersistedPropertyDefinition<T> where T: IPersistedObject{
public Func<T, object> PropertyGetter{get;set;}
public Action<T, object> PropertySetter {get;set;}
}
我有我的IPersistedObject,可以给出他的定义
public interface IPersistedObject{
PersistedElementDefinition<TypeOfTheImplementingType> Definition {get;}
}
这个想法是,如果我实现IPersistedObject,我应该这样实现它:
public class MyPersistedObject:IPersistedObject{
PersistedElementDefinition<MyPersistedObject> Definition{get;}
}
当我坚持我的班级有以下事情:
我不能执行以下操作:
public interface IPersistedObject<T>{
PersistedElementDefinition<T> Definition {get;}
}
因为:
- 它允许有一个
MyPersistedObject<SomeOtherObject - 有时我收到一个对象,我应该能够查看它是否实现了 IPersistedObject 并使用它执行一些自定义操作。
对于 2,如果我有一个通用接口,下面是一个例子,说明我面临什么样的问题:
public void Persist<T>(T objectToPersist)where T:IPersistedObject{
...
foreach(PersistedPropertyDefinition<T> property in objectToPersist.PropertiesToPersist){
object objectToSerialize = property.ObjectGetter(objectToPersist);
if(objectToSerialize is IPersistedObject<___Don't know how to put something generic here___>){
Persist((IPersistedObject<___Don't know how to put something generic here___>)objectToSerialize);
}
}
...
}
在 C# 中是否有可能声明具有实现类型的泛型属性的接口?
【问题讨论】:
-
还有什么问题?
-
不清楚为什么不能有
IPersistedObject<T>能解释一下吗?最终目标是什么?你想达到什么目的?这看起来像一个 XY 问题。 -
你想在这里解决什么问题?我不完全理解您的类型层次结构,所以我没有太多帮助,但正如一些建议:仅在可以帮助您轻松推理代码及其编译时间保证的范围内使用类型系统。如果你的类型层次结构让你为了实现一个接口而做心理体操(我以前曾在这个地方做过),你可能最好少一点编译时安全性和多一点头。
-
你将如何使用所有这些接口?
-
你基本上是在慢慢走向curiously recurring template pattern,尽管这有其自身的局限性(特别是它没有解决你在上一段中提到的问题:可以定义完全无效接口的实现)。