C#-创建一个其构造函数采用通用参数的类,导致转换异常

Alhazen

我有IInfo它的通用版本:

public interface IInfo
{
    IInput Input { get; }
}

public interface IInfo<T> : IInfo where T : IInput
{
    new T Input { get; }
}

类的实现:

public class Info : IInfo<IInput>
{
    public IInput Input { get; }    

    public Info (IInput input) {}
}

从IInput创建IOutput的工厂:

public class GenericFactory<TInput, TOutput> where TInput : IInput where TOutput : IOutput
{
    public IOutput Create(IInfo info)
    {
        ConstructorInfo cInfo = typeof(TOutput).GetConstructor(new[] { typeof(IInfo<TInput>) });
        object output = cInfo.Invoke(new object[] {cInfo});
    }
}

要测试上面的代码:

public class TestInput : IInput 
{       
}

public abstract class AbstractOutput<TInput> : IOutput where TInput : IInput
{       
}

public class TestOutput: AbstractOutput<TestInput>
{
    public TestOutput(IInfo<TestInput> info)
    {

    }       
}

public void Test()
{
    IInput input = new TestInput();
    IInfo info = new Info(input);

    var factory = new GenericFactory<TestInput, TestOutput>();
    IOutput output = factory.Create(info);
}

我收到以下错误:

Object of type 'Info' cannot be converted to type'Info<TestInput>'.

旁注:我乐于接受任何以不同方式简化/重新编写代码的建议。

public TestOutput(IInfo<TestInput> info)
{

}

正在期待一个IInfo<TestInput> 明确的但是,您正在尝试使用IInfo<IInput>(这就是Info它的设计目标)调用它

为了清楚起见,您还可以编写:

IInput input = new OtherInput();
IInfo info = new Info(input);

var factory = new GenericFactory<TestInput, TestOutput>();
IOutput output = factory.Create(info);

现在您已经提供IInfo<OtherInput>了期望的东西IInfo<TestInput>

您需要进行IInfo<T> 逆向转换才能进行强制转换,例如:

public interface IInfo<in T> : IInfo 
    where T : IInput
{
    //new T Input { get; }
}

但是请注意,T使用逆向接口返回是非法的另一种方法是使Info通用,然后更改Create为接受IInfo<TInput>在尝试传递IInfo<OtherInput>给时Create()后者会为您带来编译时错误的好处,而不是运行时错误

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我正在尝试创建一个使用C ++中的参数包构造函数的异常类

来自分类Dev

为通用类创建一个具体的构造函数,而无需在C#中继承

来自分类Dev

为重复的代码创建一个C#通用类

来自分类Dev

MongoDB C#创建一个函数,我可以将类型/类名作为参数传递给它

来自分类Dev

Unity C# 错误:“Sprite”不包含采用 0 个参数的构造函数

来自分类Dev

我可以创建一个可以采用任何枚举的模板(非类型)参数类吗?C++11

来自分类Dev

我可以从 C# 中另一个类的构造函数调用构造函数吗?

来自分类Dev

C ++中带有另一个模板类作为参数的构造函数

来自分类Dev

C#通用列表作为构造函数参数

来自分类Dev

C#通用列表作为构造函数参数

来自分类Dev

创建一个类来调用实体C#

来自分类Dev

C# 从类型 FullName 创建一个类的实例

来自分类Dev

C#方法:是否有一个参数名称可以通用地插入“派生类名称”?

来自分类Dev

如何在C#中创建一个采用多个设定值的方法?

来自分类Dev

具有构造函数参数的C#新类,该构造函数引用正在创建该类的类

来自分类Dev

C#构造函数由于另一个构造函数而中断

来自分类Dev

具有一个默认参数和一个变量参数的C ++构造函数

来自分类Dev

c ++创建一个类,调用其函数并在一条语句中推回vector

来自分类Dev

C#用默认构造函数的另一个类的字符串填充List <T>

来自分类Dev

同一类的另一个构造函数中的c ++调用构造函数

来自分类Dev

C# - 将一个对象传递给构造函数,该对象目前为空,但稍后会创建

来自分类Dev

构造函数中的 C++ 语法错误 - 参数是对来自另一个类的对象的引用

来自分类Dev

使用充当expando的构造函数创建C#类

来自分类Dev

多类的C#通用参数

来自分类Dev

C#和强制转换通用参数

来自分类Dev

在C中创建一个通用的“函数指针”联合是一个坏主意吗?

来自分类Dev

C#替代无参数构造函数

来自分类Dev

C#构造函数作为方法的参数?

来自分类Dev

C#类和实例构造函数

Related 相关文章

  1. 1

    我正在尝试创建一个使用C ++中的参数包构造函数的异常类

  2. 2

    为通用类创建一个具体的构造函数,而无需在C#中继承

  3. 3

    为重复的代码创建一个C#通用类

  4. 4

    MongoDB C#创建一个函数,我可以将类型/类名作为参数传递给它

  5. 5

    Unity C# 错误:“Sprite”不包含采用 0 个参数的构造函数

  6. 6

    我可以创建一个可以采用任何枚举的模板(非类型)参数类吗?C++11

  7. 7

    我可以从 C# 中另一个类的构造函数调用构造函数吗?

  8. 8

    C ++中带有另一个模板类作为参数的构造函数

  9. 9

    C#通用列表作为构造函数参数

  10. 10

    C#通用列表作为构造函数参数

  11. 11

    创建一个类来调用实体C#

  12. 12

    C# 从类型 FullName 创建一个类的实例

  13. 13

    C#方法:是否有一个参数名称可以通用地插入“派生类名称”?

  14. 14

    如何在C#中创建一个采用多个设定值的方法?

  15. 15

    具有构造函数参数的C#新类,该构造函数引用正在创建该类的类

  16. 16

    C#构造函数由于另一个构造函数而中断

  17. 17

    具有一个默认参数和一个变量参数的C ++构造函数

  18. 18

    c ++创建一个类,调用其函数并在一条语句中推回vector

  19. 19

    C#用默认构造函数的另一个类的字符串填充List <T>

  20. 20

    同一类的另一个构造函数中的c ++调用构造函数

  21. 21

    C# - 将一个对象传递给构造函数,该对象目前为空,但稍后会创建

  22. 22

    构造函数中的 C++ 语法错误 - 参数是对来自另一个类的对象的引用

  23. 23

    使用充当expando的构造函数创建C#类

  24. 24

    多类的C#通用参数

  25. 25

    C#和强制转换通用参数

  26. 26

    在C中创建一个通用的“函数指针”联合是一个坏主意吗?

  27. 27

    C#替代无参数构造函数

  28. 28

    C#构造函数作为方法的参数?

  29. 29

    C#类和实例构造函数

热门标签

归档