Получить список универсальных типов, применяемых к любому классу - PullRequest
3 голосов
/ 09 декабря 2010

У меня есть особая потребность, которую я не могу понять. Я провел некоторое исследование этого, но не могу найти подходящее решение.

У меня есть базовый класс:

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>.

Надеюсь, это имеет смысл.

1 Ответ

2 голосов
/ 09 декабря 2010

При следующем определении класса

    class BaseProvider<T>
    {
        //...
    }

следующий код возвращает System.Int32:

        Type type = typeof(BaseProvider<Int32>);
        foreach (var arg in type.GetGenericArguments())
        {
            MessageBox.Show(arg.FullName);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...