从多个不同的列表创建一个通用列表

时间:2012-07-18 08:58:00

标签: c# wcf generics

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

我在Silverlight中使用Entity Framework从数据库中获取数据,我有多个页面,我使用EF。

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

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

所以我的WCF功能应该像

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

    }

我的问题是,如何将所有已知列表转换为List。我对此很新,所以任何帮助都会非常感激。

谢谢。

2 个答案:

答案 0 :(得分:1)

你可以使用T

public static List<T> o<T>(List<T> a)
        {
             return a = new List<T>();
        }

答案 1 :(得分:0)

正如Sophex所述,您可以编写一个通用函数来处理List<>或更好的IList<>任何事情。

所以你的例子会变成,

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

这是非常通用的,并且要求并暗示T。对于您想要执行的处理,这可能就足够了,但是您没有说。

通常,您应该将方法签名视为调用者必须对函数进行的承诺。您应该将承诺限制为仅执行其功能所需的功能。通过这种方式,承诺更容易实现,并且您的功能可以通过来自呼叫者的更少承诺来更多地重复使用。

你现在的功能,实际上并不需要参数,而是更好地定义为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;
    }
}

或者,您可以将函数的非泛型部分作为typed delegate参数,保持函数通用,可能是这样的。

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

我希望这个答案能给你一些想法并说明我的观点,正确的答案取决于你希望你的功能达到什么目的。