2009-08-11 9 views
1

Ok У меня есть общий интерфейсСоздание экземпляра класса, который реализует общий интерфейс

public IConfigurationValidator<T> 
{ 
void Validate(); 
} 

класс, который реализует это:

public class SMTPServerValidator : IConfigurationValidator<string> 
    { 


     public void Validate(string value) 
     { 
      if (string.IsNullOrEmpty(value)) 
      { 
       throw new Exception("Value cannot be null or empty"); 
      } 
     } 


    } 

теперь я хочу использовать отражение для создания экземпляра SMTPServerValidator, потому что я знаю имя AssemblyQualifiedName.

Я думал использовать Activator.CreateInstance и отбрасывать, что интерфейс ... так:

IConfigurationValidator<T> validator = (IConfigurationValidator<T>)Activator.CreateInstance(typeof(SMTPServerValidator)); 

Я не знаю, что Т .... Как я использовать отражение, чтобы создать экземпляр этого класса?

Существует еще один класс, который имеет, что я имею дело с этим я ушел из:

public class ConfigurationSetting<T> 
    { 

     IConfigurationValidator<T> m_Validator; 

     public ConfigurationSetting(IConfigurationValidator<T> validator) 
     { 
      m_Validator = validator; 
     } 

     public void Validate(T value) 
     { 
      m_Validator.Validate(value); 
     } 
    } 

В конце концов я пытаюсь создать ConfigurationSettings и нужно передать в соответствующий валидатор на основе параметра.

+0

не Должен ли метод осущий Validate имеет параметров? –

+0

Я изменил много вещей вокруг ... Я понял, что у меня были другие проблемы ... – CSharpAtl

ответ

0

Создание экземпляра класса очень просто - вы сделали это уже с Activator.CreateInstance.

Если вы не знаете, что такое T, то как вы надеетесь использовать это как реализация интерфейса?

Я предполагаю, что на самом деле интерфейс фактически относится к T в членах. Если это не так, или если вам не нужны эти биты, тогда сделайте его не общим, или создайте базовый интерфейс, не поддерживающий базовый интерфейс.

+0

У меня есть имя конкретного типа (SMTPServerValidator) и вы хотите создать экземпляр, но хотите использовать его через интерфейс. – CSharpAtl

+0

Возможно, существует другой класс проверки, который реализует интерфейс, но с T как int. Я готов пойти совершенно иначе, если у вас есть идеи ... – CSharpAtl

+0

Как вы собираетесь * использовать * интерфейс, если вы не знаете, что такое T? Что вы можете проверить, не зная тип? –

0

В приведенном примере T является string. Это то, что вы имеете в виду?

+0

Все, что я знаю, это то, что у меня есть имя типа, и я знаю, что он реализует общий интерфейс, поэтому я хочу его отбросить к интерфейсу от Activator.CreateInstance(), но для передачи мне нужно знать, что такое T, но я не знаю, что это такое .... поскольку это может быть какой-то другой класс, а T может быть int .... или любым другой тип объекта – CSharpAtl

0

класс вы хотите, чтобы бросить на это IConfigurationValidator < строка >, как SMTPServerValidator реализует IConfigurationValidator <T>, указав T в виде строки

+0

, но это может быть другой класс, а T может быть int ... но я хочу, чтобы все еще отбрасывать интерфейс. ..so может реализовать IConfigurationValidator CSharpAtl

+0

Почему это может быть в IConfigurationValidator ? SMTPServerValidator, который является тем, что вы создаете экземпляр, реализует IConfigurationValidator thecoop

0

я понял, что на более высоком уровне у меня есть тип и может создать его в который я изначально собирался сделать.

0

Как насчет

Type lConfigValidatorType = typeof(IConfigurationValidator<>) 
Type lSomeOtherType = typeof(T) 
Type lConstructedType = lConfigValidatorType.MakeGenericType(lSomeOtherType); 
var lObject = Activator.CreateInstance(lConstructedType) 
+0

Вы не можете создать экземпляр интерфейса. – JCoder23