【问题标题】:Passing a generic List<> in C#在 C# 中传递泛型 List<>
【发布时间】:2010-01-12 17:45:07
【问题描述】:

我要脑死了;我根据特定的类(c1、c2、c3 ...)定义了几个列表。我有一种方法可以处理这些列表上的信息。我想要做的是传入特定列表,但让方法接受通用列表,然后通过 typeof 确定要做什么具体工作。我知道它可能,但我似乎无法在方法方面获得正确的语法。所以,例如:

List<c1> c1var;
List<c2> c2var;
List<c3> c3var;

some_method(c1var);
some_method(c2var);
some_method(c3var);

class some_thing
some_method(List<> somevar)
if typeof(somevar).name = x then
esle if typeof(somevar).name = y then....

如何设置方法的参数列表?

提前致谢 R.桑德斯

【问题讨论】:

  • 快速提问,为什么不重载 some_method 来接受特定类型的列表而不是 typeof?

标签: c# generics list


【解决方案1】:

您还需要将some_method 声明为泛型。

void SomeMethod<T>(List<T> someList)
{
    if (typeof(T) == typeof(c1))
    {
         // etc
    }
}

【讨论】:

  • 小心使用 typeof 这样的。这将在不考虑类型层次结构的情况下检查类型是否完全相同。因此,像 MemoryStream 和 Stream 这样的东西不会评估为相同的类型(typeof(MemoryStream) == typeof(Stream) 评估为 false)。这可能是需要的,但需要注意。使用“is”关键字是评估类型的典型方式,因为“MemoryStream is Stream”将评估为 true,因为它们共享相同的对象层次结构。
【解决方案2】:

小心使用 typeof(typ1) == typeof(typ2)。这将测试无论类型层次结构,这些类型是否等效。

例如:

typeof(MemoryStream) == typeof(Stream); // evaluates to false
new MemoryStream() is Stream; //evalutes to true

检查对象是否属于某个类型的更好方法是使用“is”关键字。下面是一个例子:

public static void RunSnippet()
{
    List<c1> m1 = new List<c1>();
    List<c2> m2 = new List<c2>();
    List<c3> m3 = new List<c3>();

    MyMeth(m1);
    MyMeth(m2);
    MyMeth(m3);
}

public static void MyMeth<T>(List<T> a)
{
    if (a is List<c1>)
    {
        WL("c1");
    }
    else if (a is List<c2>)
    {
        WL("c2");
    }
    else if (a is List<c3>)
    {
        WL("c3");
    }
}   

【讨论】:

    【解决方案3】:

    在参数部分放 List 然后在代码中尝试 switch(typeof(T){case typeof(int): break;})

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-26
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多