【问题标题】:Creating an instance of a class that implements generic interface创建实现泛型接口的类的实例
【发布时间】:2009-08-11 21:53:18
【问题描述】:

好的,我有一个通用接口

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

【问题讨论】:

  • Validate方法不应该没有参数吗?
  • 我改变了很多东西...我意识到我还有其他问题...

标签: c# .net generics reflection


【解决方案1】:

创建类的实例很容易 - 您已经使用 Activator.CreateInstance 完成了。

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

我假设实际上,接口实际上是指成员中的T。如果它没有 - 或者如果您不需要这些位 - 然后将其设为非泛型,或创建一个非泛型基本接口,该基本接口扩展。

【讨论】:

  • 我有具体类型的名称(SMTPServerValidator),想创建实例但想通过接口使用。
  • 可以有一个不同的验证器类来实现接口,但 T 为 int。如果你有想法,我愿意走完全不同的方向......
  • 如果您不知道 T 是什么,您将如何使用界面?你可以在不知道类型的情况下验证什么?
  • 是的......我的逻辑有点高,我试图做的一切都崩溃了......
【解决方案2】:

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

【讨论】:

  • 我所知道的是我有一个类型名称,并且我知道它实现了泛型接口,所以我想将它从 Activator.CreateInstance() 转换为接口,但要转换我需要知道 T 是什么,但我不知道它是什么......因为这可能是其他一些类,而 T 可能是一个 int....或任何其他对象类型
【解决方案3】:

您要转换为的类是 IConfigurationValidator,因为 SMTPServerValidator 实现了 IConfigurationValidator,将 T 指定为字符串

【讨论】:

  • 但它可能是一个不同的类,T 可能是一个 int...但我仍想转换为接口...所以可以实现 IConfigurationValidator
  • 为什么会出现在 IConfigurationValidator 中? SMTPServerValidator,即您正在创建的实例,实现了 IConfigurationValidator
【解决方案4】:

怎么样

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

【讨论】:

  • 你不能创建一个接口的实例。
【解决方案5】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多