2016-06-14 4 views
1

У меня есть словарь типов классов, выглядит следующим образом:C# Pass Словарь типов класса в Generic

private static Dictionary<int, Type> GetArrayOfClassInstances() 
    { 
     var availability = new LeisureLinkBaseProduct.Availability(); 
     var baseRate = new LeisureLinkBaseProduct.BaseRate(); 
     var stayRestrictions = new LeisureLinkBaseProduct.StayRestrictions(); 
     var checkInInformation = new LeisureLinkBaseProduct.CheckInInformation(); 
     var specials = new LeisureLinkBaseProduct.Specials(); 
     var taxes = new LeisureLinkBaseProduct.Taxes(); 
     var fees = new LeisureLinkBaseProduct.Fees(); 

     var classDictionary = new Dictionary<int, Type>(); 
     classDictionary.Add(1, availability.GetType()); 
     classDictionary.Add(2, baseRate.GetType()); 
     classDictionary.Add(3, stayRestrictions.GetType()); 
     classDictionary.Add(4, checkInInformation.GetType()); 
     classDictionary.Add(5, specials.GetType()); 
     classDictionary.Add(6, taxes.GetType()); 
     classDictionary.Add(7, fees.GetType()); 

     return classDictionary; 
    } 

И я хочу, чтобы передать его в этот общий метод, который выглядит следующим образом:

   var classes = GetArrayOfClassInstances(); 

       foreach (var instance in classes) 
       { 
        var request = RequestBuilder.BuildAdditionalDataRequest(link.href); 
        var response = Api<instance.value>(request.Endpoint); 
       } 

но я получаю ошибку intellisense «экземпляр - это переменная, но используется как тип», как передать этот тип класса в общий? Это возможно? Благодаря!

+1

В общей сложности в сторону на ваш вопрос, вам не нужно, чтобы создать экземпляр, чтобы получить его тип, вы можете сделать (например) 'вар налоги = TypeOf (LeisureLinkBaseProduct.Taxes);' – Jamiec

+0

о приятно, что это намного лучше то, что я делал –

+1

[этот вопрос] (http://stackoverflow.com/questions/266115/pass-an-instantiated-system-type-as-a-type-parameter-for-a-generic-class?rq = 1) говорит о создании экземпляра универсального класса с экземпляром 'Type', но процесс будет аналогичным, если' Api' в вашем коде является вызовом метода. – Jamiec

ответ

0

Следующая RAN для меня и базируется на this post:

Api Класс:

public class Api<T> 
{ 
    public Api(Type E){} 
} 

Создать метод Api:

private static void CreateApis() 
    { 
     var classes = GetArrayOfClassInstances(); 


     foreach (KeyValuePair<int, Type> instance in classes) 
     { 
      Type apiType = typeof(Api<>).MakeGenericType(instance.Value); 

      var api = Activator.CreateInstance(apiType, new[]{typeof(System.Net.EndPoint)}); 
     } 
    } 
0

Вам потребуется отражение как тип не известен во время компиляции:

typeof(Api<>).MakeGenericType(instance.value) 
    .GetConstructor(new[] {typeof(Endpoint)}) 
    .Invoke(new[]{request.Endpoint}); 
+0

intellisense взрывается на этом, может быть, я использую его неправильно? –

+0

Мне нужно заглянуть в отражение немного больше, его довольно над моей головой в данный момент –

Смежные вопросы