我正在编写一个Silverlight和WCF项目。
我在Silverlight中使用Entity Framework从数据库中获取数据,我有多个页面,我使用EF。
现在,我有超过100种类型的实体类,因此有多种已知的列表类型。
在我的WCF界面中,我想创建一个通用函数,我可以将所有这些列表类型作为一个通用参数接受。
所以我的WCF功能应该像
public string TestBadal(List<Object> list)
{
return "test";
}
我的问题是,如何将所有已知列表转换为List。我对此很新,所以任何帮助都会非常感激。
谢谢。
答案 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);
我希望这个答案能给你一些想法并说明我的观点,正确的答案取决于你希望你的功能达到什么目的。