2009-08-11 137 views
1

好吧,我有一个通用的接口创建实现通用接口的类的实例

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)); 

我不知道T是什么....我怎么使用反射来创建一个这个类的实例?

有是有,我处理,我离开了另一个类:

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

不应该的验证方法IMPL没有参数? – 2009-08-11 21:59:16

+0

我改变了很多东西...我意识到我有其他问题... – CSharpAtl 2009-08-12 03:31:57

回答

0

创建类的实例非常简单 - 您已经完成了Activator.CreateInstance

如果你不知道什么是T是你怎么希望使用这个作为接口的实现?

我假设实际上,接口实际上是指成员中的T。如果没有 - 或者如果你不需要这些位 - 那么使它不是通用的,或者创建一个基本接口扩展的非通用基接口。

+0

我具有具体类型(SMTPServerValidator)的名称,并且想要创建实例但希望通过该接口使用它。 – CSharpAtl 2009-08-12 02:49:27

+0

可能有一个不同的验证器类来实现接口,但将T作为int。如果您有想法,我愿意采取完全不同的方向...... – CSharpAtl 2009-08-12 03:00:47

+0

如果您不知道T是什么,您将如何使用*接口?你可以在不知道类型的情况下验证什么? – 2009-08-12 05:17:48

0

在给出的示例中,Tstring。你是这个意思吗?

+0

我所知道的是我有一个类型名称,我知道它实现了通用接口,所以我想要施放它从Activator.CreateInstance()的接口,但要演员我需要知道T是什么,但我不知道它是什么....因为这可能是一些其他类,T可能是int ...或任何其他对象类型 – CSharpAtl 2009-08-12 02:52:05

0

要强制转换为类是IConfigurationValidator <串>,作为SMTPServerValidator实现IConfigurationValidator <牛逼>,指定T作为字符串

+0

但它可能是一个不同的类,并且T可能是一个int ...但我仍想投入界面。 ..so可以实施IConfigurationValidator CSharpAtl 2009-08-12 02:54:01

+0

为什么它可以在IConfigurationValidator ? SMTPServerValidator,这是你正在创建一个实例,实现IConfigurationValidator thecoop 2009-08-12 09:40:17

0

我在更高一层我有类型,可以创建它的实现我最初打算做的方式。

0

如何

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

你不能创建一个接口的实例。 – JCoder23 2013-06-18 12:03:39