0

我正在编写一个 Silverlight 和 WCF 项目。

我使用 Silverlight 中的实体框架从数据库中获取数据,我有多个使用 EF 的页面。

现在,我有 100 多种类型的实体类,因此有多种已知的列表类型。

在我的 WCF 界面中,我想创建一个通用函数,我可以在其中接受所有这些列表类型作为一个通用参数。

所以我的 WCF 函数应该是

public string TestBadal(List<Object> list)
    {
        return "test";

    }

我的问题是,如何将所有已知列表转换为 List。我对此相当陌生,因此将不胜感激任何帮助。

谢谢你。

4

2 回答 2

1

你可以使用 T

public static List<T> o<T>(List<T> a)
        {
             return a = new List<T>();
        }
于 2012-07-18T09:41:51.120 回答
0

正如Sophex所说,您可以编写一个通用函数来处理 aList<>或更好IList<>的任何东西。

所以你的例子会变成,

public string TestBadal<T>(IList<T> list)
{
    return "test";
}

这是非常通用的,并且几乎不需要并且暗示关于T. 这对于您想要执行的处理可能已经足够了,但是您不会说。

通常,您应该将方法签名视为调用者必须对函数做出的承诺。您应该将承诺限制在您的功能完成其工作所需的范围内。这样,promise 更容易实现,并且您的函数可以被更多地重用,而调用者的承诺更少。

就目前而言,您的函数实际上并不需要参数,最好将其定义为string const但是说,您要做的就是枚举可以使用的项目,

public string TestBadal<T>(IEnumerable<T> entities)
{
    foreach(T entity in entities)
    {
        ...
    }
}

如果您的处理与您可以执行的数据源的EF特性特别相关,

public string TestBadal<TEntity>(EntitySet<TEntity> entities)
    where TEntity : class
{
    ...
}

如果您需要了解列表中的类型,那么您有两个明智的选择。要么您需要类型来实现某个接口,这本质上使您的函数非泛型,并且与 EF 结合使用可能会很尴尬。

public string TestBadal(IEnumerable<IDefinedType> definedTypeInstances)
{
    foreach(IDefinedType instance in definedTypeInstances)
    {
       var x = instance.SomeDefinedProperty;
    }
}

或者,您可以将函数的非通用部分作为类型化委托参数,保持函数通用,可能是这样的。

public string TestBadal<T>(
        IList<T> list,
        Func<T, string> stringSelector)
{
    var result = new StringBuilder();

    for(var i = 0; i < list.Count; i++)
    {
        result.AppendLine(stringSelector(list[i])
    }

    return result.ToString();
}

您可以使用类似这样的 lambda 表达式调用此函数,

var result = TestBadal(entities, e => e.SomeStringProperty);

我希望这个答案既能给你一些想法,又能说明我的观点,即正确的答案取决于你希望你的函数实现什么。

于 2012-07-19T08:57:58.190 回答