У меня есть особая потребность, которую я не могу понять. Я провел некоторое исследование этого, но не могу найти подходящее решение.
У меня есть базовый класс:
public abstract class BaseProvider<T> {}
этот класс в свою очередь наследуется двумя различными классами провайдеров:
public sealed class MonkeyProvider<T>
: BaseProvider<MonkeyProvider<T>>
where T
: IAnimalProvider
Внутри интерфейса IAnimalProvider я раскрываю единственное свойство, которое должны быть получены всеми реализациями. Теперь MonkeyProvider и, возможно, DonkeyProvider или что-то подобное должны знать, какое значение назначено для свойства корневого экземпляра:
public class JoburgZoo
: IAnimalProvider
{
#region IAnimalProvider members
public string Id{ get; set; }
#endregion
}
// somewhere in a console application
public static void Main(string[] args)
{
JoburgZoo zoo = new JoburgZoo();
zoo.Id = "Mammals";
**// edit: an instance of the provider will be created**
MonkeyProvider<JoburgZoo> mp = new MonkeyProvider<JoburgZoo>();
mp.CheckMonkeys(zoo); // where CheckMonkeys(JoburgZoo) is a method in the provider
}
Теперь вот мой актуальный вопрос:
Мне нужно предоставить внутреннее свойство через BaseProvider, к которому имеет доступ каждый экземпляр, который его реализует. Это свойство должно возвращать значение «Id» в любой заданной точке, но мне кажется, что я не могу получить значение путем отражения (что, я знаю, является решением этой проблемы).
Из моих разных бесплодных усилий:
Type type = typeof(T); // this returns BaseProvider<MonkeyProvider<T>>
var generic = type.GetGenericTypeDefinition(); // brings back BaseProvider<T>
Я не могу создать новый экземпляр T, так как он очистит все значения, назначенные в данный момент объекту. Я не могу перебрать коллекцию информации о свойствах, поскольку она будет возвращать только свойства BaseProvider.
Спасибо за любую помощь в этом.
Eric
// Редактировать.
Добавлен дополнительный вызов в основной код консоли выше. экземпляр MonkeyProvider<T>
шаблонов JoburgZoo, поэтому в ProviderBase<T>
это будет выглядеть примерно так:
ProviderBase<MonkeyProvider<JoburgZoo>>
Я хочу знать, каковы свойства JoburgZoo изнутри BaseProvider<T>
без необходимости идентифицировать объект с помощью MonkeyProvider<T>
.
Надеюсь, это имеет смысл.