Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使重复代码通用_C#_.net_C# 4.0 - Fatal编程技术网

C# 使重复代码通用

C# 使重复代码通用,c#,.net,c#-4.0,C#,.net,C# 4.0,是否可以像这样包装重复代码: IList<Bla1> Bla1s = (from a in Containers where a.Right.GetType().Name.Equals("Bla1") select ( (Bla1) a.Right )).Distinct().ToList<Bla1>(); IList<T> GenericMethod<T>() { return Containers.Select(c

是否可以像这样包装重复代码:

IList<Bla1> Bla1s = (from a in Containers
       where a.Right.GetType().Name.Equals("Bla1")
select
(
  (Bla1) a.Right
)).Distinct().ToList<Bla1>();
IList<T> GenericMethod<T>()
{
    return Containers.Select(c => c.Right).OfType<T>().Distinct().ToList();
}
IList Bla1s=(来自容器中的
其中a.Right.GetType().Name.Equals(“Bla1”)
选择
(
(Bla1)a.对
)).Distinct().ToList();

转化为通用构造(方法?)。有很多BLA(Bla1,Bla2…)。我想Bla会代表T,但我对这种情况下的泛型没有太多经验。谢谢。

如果您使用的字符串始终与类名完全相等,则选择“是”

IList<T> Bla1s = (from a in Containers
       where a.Right.GetType().Name.Equals(typeof(T).Name)
select
(
  (T) a.Right
)).Distinct().ToList<T>();
IList Bla1s=(来自容器中的
其中a.Right.GetType().Name.Equals(typeof(T).Name)
选择
(
(T) a.对
)).Distinct().ToList();
或者完全删除字符串:

IList<T> Bla1s = (from a in Containers
       where a.Right.GetType().Equals(typeof(T))
select
(
  (T) a.Right
)).Distinct().ToList<T>();
IList Bla1s=(来自容器中的
其中a.Right.GetType()等于(typeof(T))
选择
(
(T) a.对
)).Distinct().ToList();

如果要测试类型而不仅仅是类型名称,则可以执行以下操作:

IList<T> items = Containers.Select(c => c.Right).OfType<T>().Distinct().ToList();

注意:这意味着从
T
派生的类也将包括在内。如果这不可取,可以使用
.Where(c=>c.GetType()==typeof(T)).Cast()
@hvd我感觉OP想要做一个
is T
测试,但你是对的,这与问题中的代码不同。我已经编辑了我的答案。最后一种通用方法很好用。但请在签名中添加容器。谢谢谢谢我尝试了一些类似的方法,目前的挑战在于使其成为一个静态方法。。。虽然我导入了System.Collections.Generic,但还是出现了一些名称空间错误。@csetzkorn将其设置为静态完全是另一个问题。我可以想象,
Containers
是某个类的非静态成员,因此静态函数无法到达那里。你必须添加更多的代码或发布不同的问题才能得到更具体的答案。
IList<T> GenericMethod<T>(IEnumerable<Container> containers)
{
    return containers.Select(c => c.Right)
        .Where(x => x.GetType() == typeof(T)).Cast<T>()
        .Distinct().ToList();
}