2009-08-11 128 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