创建实现通用接口的类的实例

时间:2009-08-11 21:53:18

标签: c# .net generics reflection

好的,我有一个通用界面

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并需要根据参数传入适当的验证器。

5 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

创建类的实例很简单 - 您已经使用Activator.CreateInstance完成了该操作。

如果您不知道T是什么,您希望如何使用作为接口的实现?

我认为实际上,界面实际上是指成员中的T。如果它不 - 或者如果你不需要那些位 - 那么使它成为非泛型,或者创建一个非基础接口扩展的非通用基接口。

答案 2 :(得分:0)

要转换为的类是IConfigurationValidator&lt; string&gt;,因为SMTPServerValidator实现了IConfigurationValidator&lt; T&gt;,将T指定为字符串

答案 3 :(得分:0)

我意识到在更高层,我确实有类型,并且可以按照我最初打算做的方式创建它。

答案 4 :(得分:0)

怎么样

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