.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服务调用来获取我希望避免的正常数据和地图数据。

.NET方法的动态返回类型

您只能在编译时指定类型的情况下使用泛型,所以我认为它们不适合您的情况。

我建议进行两次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和所有其他必需的类从中继承