Я шаблонного типа, который используется, чтобы дать некоторые мета-данные об объекте упорствовать:Объявить общий тип как свойство интерфейса?
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 'вы можете немного объяснить? и какова конечная цель? чего вы пытаетесь достичь? Это похоже на проблему XY. –
Какую проблему вы пытаетесь решить здесь?Я не совсем понимаю вашу иерархию типов, поэтому я не очень помогаю, но так же, как некоторые советы: используйте систему типов только в той мере, в которой это помогает вам легко рассуждать о вашем коде и его гарантиях времени компиляции. Если в вашей иерархии типов вы делаете умственную гимнастику только для того, чтобы реализовать интерфейс (я уже был в этом месте раньше), вам, вероятно, будет лучше с меньшим временем безопасности компиляции и немного больше волос на голове. –