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

本文关键字:类型 方法 返回 参数 于输入 输入 | 更新日期: 2023-09-27 17:51:11

我有4个输入类型类,比如

  • T1:类AInput、类BInput、类CInput和类DInput

我也有3个输出类型类,比如

  • T2: XOutput,类YOutput和类ErrorOutput

现在我必须在服务类中编写一个泛型方法,如"GetResponse",如下所示-

  1. 如果方法GetResponse的输入参数属于AInput类和BInput类,则该方法应返回XOutput类。

  2. 如果方法GetResponse的输入参数属于CInput类和DInput类,则该方法应返回YOutput类。

  3. 如果出现错误,此方法将返回类型类ErrorOutput

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

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

不,泛型类型约束不能在。net中实现这些高级概念。您可以提供重载:

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

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

  • 开放泛型是像GetStuff<T>这样的方法,其中T可以由调用者指定,因此保持开放。
  • 封闭泛型是GetStuff<int>等方法。类型是立即已知的,WCF可以确定将哪种类型传递给它的WSDL。

格式不支持,后者是。这意味着您必须经历一些麻烦才能使伪泛型在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
{
}

是的,您可以通过为所有输入和输出类实现interface来实现这种形式。就像其他人提到的,这也可以用基类来完成,但我认为使用接口更好,因为你不能继承多个类,但要实现多个接口。

输入类和接口:

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"