C# 从基于C中输入参数类型的方法返回特定类型#

C# 从基于C中输入参数类型的方法返回特定类型#,c#,generics,C#,Generics,我有4个输入类型的类 T1:AInput类、BInput类、CInput类和DInput类 我还有3个输出类型的类 T2:XOutput、class YOutput和class ErrorOutput 现在我必须在服务类中编写一个通用方法,如“GetResponse”,如下所示- 如果方法GetResponse的输入参数属于类AInput和类BInput,则此方法应返回类XOutput 如果方法GetResponse的输入参数属于类CInput和类DInput,则此方法应返回类YOutp

我有4个输入类型的类

  • T1:AInput类、BInput类、CInput类和DInput类
我还有3个输出类型的类

  • T2:XOutput、class YOutput和class ErrorOutput
现在我必须在服务类中编写一个通用方法,如“GetResponse”,如下所示-

  • 如果方法
    GetResponse
    的输入参数属于类AInput和类BInput,则此方法应返回类XOutput

  • 如果方法
    GetResponse
    的输入参数属于类CInput和类DInput,则此方法应返回类YOutput

  • 如果出现任何错误,此方法将返回类型classErrorOutput


  • 现在我的问题是,具有泛型方法的服务类是否可能遵循上述条件?

    不,泛型类型约束在.NET中无法实现这些高级概念。您可以改为提供重载:

    XOutput Foo (AInput a);
    XOutput Foo (BInput b);
    YOutput Foo (CInput b);
    YOutput Foo (DInput b);
    

    是的,您可以通过为所有的输入和输出类实现一个
    接口
    来实现某种形式的功能。正如其他人提到的,这也可以通过基类实现,但imo使用接口更好,因为您不能继承多个类,而是实现多个接口

    输入类和接口:

    interface IInput {}
    
    class AInput : IInput {}
    
    class BInput : IInput {}
    
    class CInput : IInput {}
    
    interface IOutput {}
    
    class XOutput : IOutput {}
    
    class YOutput : IOutput {}
    
    class ErrorOutput : IOutput {}
    
    输出类和接口:

    interface IInput {}
    
    class AInput : IInput {}
    
    class BInput : IInput {}
    
    class CInput : IInput {}
    
    interface IOutput {}
    
    class XOutput : IOutput {}
    
    class YOutput : IOutput {}
    
    class ErrorOutput : IOutput {}
    
    方法:

    public IOutput GetResponse(IInput input)
    {
        if (input is AInput || input is BInput)
        {
            return new XOutput();
        }
    
        if (input is CInput || input is DInput)
        {
            return new YOutput();
        }
    
        return new ErrorOutput();
    }
    
    用法:

    var input = new AInput();
    
    var response = GetResponse(input);
    
    if(response is XOutput)
    {
        Console.WriteLine("Input was {0} and output was {1}", input.GetType().Name, response.GetType().Name);
    } else if (response is YOutput)
    {
        Console.WriteLine("Input was {0} and output was {1}", input.GetType().Name, response.GetType().Name);
    }
    
    输出:

    "Input was Ainput and output was XOutput"
    

    假设我们在这里讨论的是WCF服务,那么就不可能有所谓的“开放”泛型。Microsoft通过以下方式区分开放泛型和封闭泛型:

    • 开放泛型是像
      GetStuff
      这样的方法,其中T可以由调用方指定,因此保持打开状态
    • 封闭泛型是类似于
      GetStuff
      的方法。该类型马上就知道了,WCF可以确定将为其WSDL传递什么类型
    不支持formet,支持后者。这意味着您必须经历一些麻烦,才能使伪泛型在您的WCF服务上工作

    一种方法是为通过操作返回的每种类型声明一个基类,例如在您的示例中
    OutputBase
    。然后,您可以通过继承基类在此基础上创建其他输出类型,并在您的web服务中按照以下方式放置一些内容:

    public OutputBase GetResponse(Type type, params object[] args)
    {
        if (typeof(type) == typeof(AInput) || typeof(type) == typeof(BInput))
        {
            // Return object of type XOutput which inherits OutputBase here.
            var ret = new XOutput();
            return ret;
        }
    
        if (typeof(type) == typeof(CInput) || typeof(type) == typeof(DInput))
        {
            // Return stuff of type YOutput here.
            var ret = new YOutput();
            return ret;
        }
    
        return new ErrorOutput();
    }
    
    我也不完全确定您是否可以在WCF服务调用中传递
    Type
    ,但假设您不能传递,您可以将
    Type.FullName
    作为字符串传递,然后使用
    Type.GetType(string)
    将其转换为您要查找的对象


    希望有帮助

    如果您想使用泛型,那么GetResponse方法的定义如下

    public XOutput GetResonse<TInput1, TInput2>(TInput1 input1, TInput2 input2, out ErrorOutput error)
        where TInput1 : AInput 
        where TInput2 : BInput
    {
    
    }
    
    public YOutput GetResonse<TInput1, TInput2>(TInput1 input1, TInput2 input2, out ErrorOutput error)
        where TInput1 : CInput 
        where TInput2 : DInput
    {
    
    }
    
    public XOutput GetResonse(TInput1输入1,TInput2输入2,输出错误输出错误)
    TInput1:AInput在哪里
    TInput2:BInput在哪里
    {
    }
    public YOutput GetResonse(TInput1输入1,TInput2输入2,输出错误输出错误)
    TInput1:CInput在哪里
    TInput2:DInput在哪里
    {
    }
    
    您能展示一些源代码吗?类是否与继承中的类相关?我们谈论的是WCF服务还是进程中的?基本上,这些类是DTO(仅具有字段的数据传输对象),并分为两组-请求:AInput、BInput、CInput和DINPUT。您将无法在WCF服务中使用类似的开放泛型;它无法从中确定它是WSDL。谢谢furier。我有这个设计。但是客户机希望像这样-AInput a=new AInput()//对于BInput也是//并填充所有字段,然后他只想调用像-a.DoRequest()一样的函数,返回类型应该是XOutput。对于CInput c=新CInput();c、 DoProcess()返回类型应为YOutput。有什么线索吗?那么你应该像D.R建议的那样使用相同函数的重载。