.NET方法的动态返回类型
本文关键字:返回类型 动态 方法 NET | 更新日期: 2023-09-27 17:58:32
我有一个web方法,它调用DAL中的一个方法来按id执行过程,并返回一个MyData类型的对象。
[WebMethod]
public MyData GetDataById(int id)
{
DAL myDAL = new DAL();
return myDAL.GetDataById(id);
}
类MyData看起来像下面的
public class MyData
{
public string Name;
public Data[] DataItems;
}
以及类别CCD_ 1、
public class Data
{
public string key;
public string value;
}
现在,在我们想要返回一些复杂类型之前,这种方法一直很好。
例如,DataTable
,或者类似于包含纬度、经度和值的结构(或类)。很明显,类Data
不能包含多个值或一个DataTable。(它包含两个字符串,键和值)。
所以我实际上想要的是泛型类型。所以我把它改成…
public class MyData<T>
{
public string Name;
public T[] DataItems;
}
因此,我将在myDAL.GetDataById
中执行类似的操作,因为返回的数据类型因类型而异。
if (GetTypeOfId(id) == "NormalData")
{
MyData<Data> result = new MyData<Data>();
}
else if (GetTypeOfId(id) == "Map")
{
MyData<MapData> result = new MyData<MapData>();
}
但我也需要为方法签名指定一个类型,不幸的是,它只在运行时被发现。
我该如何处理这种情况?
我觉得我在用Generics做一些我不应该用它做的事情。
或者,通常只有在运行时才发现类型的情况是如何解决的?
更新:最坏的情况是使用不同的web服务调用来获取我希望避免的正常数据和地图数据。
您只能在编译时指定类型的情况下使用泛型,所以我认为它们不适合您的情况。
我建议进行两次web服务调用,这是处理此问题的最简单方法。
如果你真的只想要一个web服务调用,你可以让你的web方法简单地返回一个字节[](使用BinaryFormatter创建)或一个字符串(使用XmlSerializer创建),然后在客户端取消序列化,但这意味着你必须在两边都有相同的类(或者你必须有自定义的去序列化代码),而且你的web服务不能轻易地被多个客户端使用。
我不确定你想要什么,但我有一种感觉,使用带有泛型方法的接口可以帮助你传递返回值,并调用GetValue泛型方法。
如果使用IData而不是泛型类型作为返回值,则可以使用ret.GetValue<MyData>()
提取嵌入的数据。如果您在创建Data<T>
时设置了"类型",您也可以对此进行查询。
也许您可以根据自己的需要调整以下片段。
public interface IData {
type Type { get; set; }
string Name { get; set; }
T GetValue<T>();
}
public class Data<T> : IData
{
public Type Type { get; set; }
public string Name { get; set; }
public T Value { get; set; }
public Tret GetValue<Tret>() {
return (Tret)(Object)Value;
}
}
答案很简单,我以前也没想过。我刚刚创建了一个父类,并使Data
和所有其他必需的类从中继承