c#中基于输入参数类型从方法返回特定类型
本文关键字:类型 方法 返回 参数 于输入 输入 | 更新日期: 2023-09-27 17:51:11
我有4个输入类型类,比如
- T1:类AInput、类BInput、类CInput和类DInput
我也有3个输出类型类,比如
- T2: XOutput,类YOutput和类ErrorOutput
现在我必须在服务类中编写一个泛型方法,如"GetResponse",如下所示-
-
如果方法
GetResponse
的输入参数属于AInput类和BInput类,则该方法应返回XOutput类。 -
如果方法
GetResponse
的输入参数属于CInput类和DInput类,则该方法应返回YOutput类。 -
如果出现错误,此方法将返回类型类ErrorOutput
现在我的问题是,一个服务类是否有可能有一个泛型方法来遵循上述条件?
不,泛型类型约束不能在。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"