C# 传递通用列表<&燃气轮机;在C中#

C# 传递通用列表<&燃气轮机;在C中#,c#,generics,list,C#,Generics,List,我在这件事上快死了;我根据特定的类别(c1、c2、c3…)定义了几个列表。我有一个方法可以处理这些列表上的信息。我想做的是传入特定列表,但让方法接受泛型列表,然后通过typeof确定要做的特定工作。我知道这是可能的,但我似乎无法在方法方面获得正确的语法。例如: List<c1> c1var; List<c2> c2var; List<c3> c3var; some_method(c1var); some_method(c2var); some_method(

我在这件事上快死了;我根据特定的类别(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....
typeof(MemoryStream) == typeof(Stream); // evaluates to false
new MemoryStream() is Stream; //evalutes to true
列表c1var;
c2var清单;
c3var清单;
某些方法(c1var);
一些_方法(c2var);
一些_方法(c3var);
给学生上课
some_方法(列出somevar)
如果typeof(somevar).name=x,则
如果typeof(somevar).name=y,则。。。。
如何设置该方法的参数列表

提前谢谢
R.Sanders

您还需要将
某些方法
声明为通用方法

void SomeMethod<T>(List<T> someList)
{
    if (typeof(T) == typeof(c1))
    {
         // etc
    }
}
void SomeMethod(List someList)
{
如果(类型(T)=类型(c1))
{
//等
}
}

在参数部分输入列表,然后尝试输入代码
开关(typeof(T){case-typeof(int):break;})
小心使用typeof(typ1)=typeof(typ2)。这将测试类型是否等效,而不考虑类型层次结构

例如:

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....
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");
    }
}   
publicstaticvoid RunSnippet()
{
列表m1=新列表();
列表m2=新列表();
列表m3=新列表();
MyMeth(m1);
MyMeth(m2);
MyMeth(m3);
}
公共静态无效MyMeth(列表a)
{
如果(是列表)
{
WL(“c1”);
}
else if(是列表)
{
WL(“c2”);
}
else if(是列表)
{
WL(“c3”);
}
}   

Quick question,你为什么不重载一些方法来接受特定类型的列表,而不是使用typeof呢?小心这样使用typeof。这将检查类型是否完全相同,而不考虑类型层次结构。因此,类似MemoryStream和Stream的内容将不会计算为相同的类型(typeof(MemoryStream)==typeof(Stream)计算为false)。这可能是需要的,但需要注意。使用“is”关键字是计算类型的典型方法,因为“MemoryStream is Stream”将计算为true,因为它们共享相同的对象层次结构。