C# 从基于C中输入参数类型的方法返回特定类型#
我有4个输入类型的类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
- T1:AInput类、BInput类、CInput类和DInput类
- T2:XOutput、class YOutput和class ErrorOutput
GetResponse
的输入参数属于类AInput和类BInput,则此方法应返回类XOutputGetResponse
的输入参数属于类CInput和类DInput,则此方法应返回类YOutput现在我的问题是,具有泛型方法的服务类是否可能遵循上述条件?不,泛型类型约束在.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通过以下方式区分开放泛型和封闭泛型:
- 开放泛型是像
这样的方法,其中T可以由调用方指定,因此保持打开状态GetStuff
- 封闭泛型是类似于
的方法。该类型马上就知道了,WCF可以确定将为其WSDL传递什么类型李>GetStuff
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建议的那样使用相同函数的重载。