好的,我有一个通用界面
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 :(得分:0)
在给出的示例中,T
为string
。这是你的意思吗?
答案 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)