.NET方法的动态返回类型

时间:2011-06-06 12:14:10

标签: c# generics

我有一个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;     
}

和班级Data

public class Data
{
    public string key;
    public string value;
}

现在这个工作正常,直到我们想要返回一些复杂的类型。

例如,一个DataTable,或者类似于包含纬度经度值的结构(或类)的东西。显然,类Data不能包含多个值或DataTable。 (它包含两个字符串,键和值)。

所以我真正想要的是Generic的类型。所以我把它改成了......

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>();
}

但是我需要为方法签名指定一个类型,不幸的是,它只在运行时被发现。

我该如何处理这种情况?

我觉得我正在使用泛型来做我不应该使用的东西。

或者通常情况下,只有在运行时才能找到类型?

更新:最糟糕的情况是,我希望避免使用不同的网络服务来获取正常数据和地图数据。

3 个答案:

答案 0 :(得分:1)

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

我建议进行两次Web服务调用,这是处理此问题的最简单方法。

如果你真的只想要一个Web服务调用,你可以让你的web方法只返回一个byte [](使用BinaryFormatter创建)或一个字符串(使用XmlSerializer创建),然后在客户端反序列化,但这意味着你必须在双方拥有相同的类(或者你必须拥有自定义反序列化代码),并且你的Web服务不能被多个客户端轻松使用。

答案 1 :(得分:0)

我不确定你要求的是什么,但我觉得使用带有泛型方法的接口可以帮助你传递返回值并在其上调用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;
    }
}

答案 2 :(得分:0)

答案很简单也很愚蠢,我以前不去想它。 我刚刚创建了一个父类,并使Data和所有其他必需的类继承自它。