我有几个Web服务可以返回各种结果。一些结果是字符串,一些是数组(从WSDL自动生成)。当我调用Web服务时,我想获得所有各种结果(包括异常),然后通过一个通用接口对它们进行操作,但由于类型不同,我无法使其工作。在下面的示例中,T是我想要存储的类型(例如List或string),U是服务返回的类型(例如Report []或string)。
private class Result<T, U> : ICommon
{
public delegate U ResultProvider();
public readonly string ElementName = null;
public readonly T Value = null;
public readonly Exception Exception = null;
public Result(string ElementName, ResultProvider Provider)
{
this.ElementName = ElementName;
try
{
this.Value = Provider();
}
catch (Exception e) {
this.Exception = e;
}
}
}
如果所有服务返回List,那么合并U和T并执行以下操作将是微不足道的:
private class Result<T> : ICommon
{
public delegate T[] ResultProvider();
public readonly string ElementName = null;
public readonly List<T> Value = null;
public readonly Exception Exception = null;
public Result(string ElementName, ResultProvider Provider)
{
this.ElementName = ElementName;
try
{
this.Value = new List<T>(Provider());
}
catch (Exception e) {
this.Exception = e;
}
}
}
但是当web方法返回非Array时,这将不起作用。所以现在我有Result<T>
和Result
(有效手持编码的Result<string>
版本)
对此设计有何建议?我应该看看哪种更好的模式?
答案 0 :(得分:0)
我认为反思就是你想要的。
你可以使用typeof(U)来获取返回类型的ResultProvder,然后很容易弄清楚返回类型是什么并相应地处理它。你可以去做.IsArray然后.GetMethod来访问返回类型的成员。
答案 1 :(得分:0)
我不确定我是否完全理解你,但是在你的第一个例子中,你是否可以创建一个带有Func<U, T>
的构造函数的重载,它将U
转换为{{1} }} S'因此,如果服务返回T
,则可以
Person[]
然后致电
public Result(string ElementName, ResultProvider Provider, Func<U, T> converter)
{
this.ElementName = ElementName;
try
{
this.Value = converter(Provider());
}
catch (Exception e) {
this.Exception = e;
}
}