C# 使用泛型类型声明方法

C# 使用泛型类型声明方法,c#,generics,C#,Generics,我在C#中使用了泛型类型,我对使用泛型类型还不熟悉。所以,现在我遇到了一个问题。我有一些类似的课程: public class MyModel1 { } public class MyModel2 { } public class BaseClass<T> { } public class ChildClass1 : BaseClass<MyModel1> { } public class ChildClass2 : BaseClass<MyModel2&g

我在C#中使用了泛型类型,我对使用泛型类型还不熟悉。所以,现在我遇到了一个问题。我有一些类似的课程:

public class MyModel1
{
}

public class MyModel2
{
}

public class BaseClass<T>
{
}

public class ChildClass1 : BaseClass<MyModel1>
{
}

public class ChildClass2 : BaseClass<MyModel2>
{
}

public class AnotherClass
{
    //What will be the syntax of declaring this method
    //The syntax of the following method is wrong and incomplete. 
    //It's there just to give an idea about whai i want to do.
    public void MyMethod<T>()
      where T : BaseClass<..what to write..>
    {

    }
}
公共类MyModel1
{
}
公共类MyModel2
{
}
公共类基类
{
}
公共类ChildClass1:基类
{
}
公共类ChildClass2:基类
{
}
公共类另一类
{
//声明此方法的语法是什么
//以下方法的语法错误且不完整。
//它只是给我一个关于我想做什么的想法。
公共方法()
其中T:BaseClass
{
}
}
我的问题是,如果我想这样调用MyMethod,那么声明MyMethod的正确语法是什么:

MyMethod<ChildClass1>();
public void MyMethod<T, U>()
where T : BaseClass<U>
{

}
MyMethod();

您忘记了提及返回类型,并在类名后添加了
。例如,如果返回类型为void,则可以将该方法声明为:

        public void MyMethod<T>()
      where T : BaseClass<T>
{

}
public void MyMethod()
其中T:BaseClass
{
}

您忘记了提及返回类型,并在类名后添加了
。例如,如果返回类型为void,则可以将该方法声明为:

        public void MyMethod<T>()
      where T : BaseClass<T>
{

}
public void MyMethod()
其中T:BaseClass
{
}
这将起作用(我的意思是它可以编译)

public void MyMethod()
其中T:BaseClass
{ }
这也是:

public void MyMethod<T>()
    where T : ChildClass1
{ }
public void MyMethod()
T:ChildClass1在哪里
{ }

阅读您的评论后进一步编辑

您可以这样做:

public class AnotherClass<TBaseClass, TModel> where TBaseClass : BaseClass<TModel>
{
    public void MyMethod(TBaseClass input)
    { }
}
public类另一个类,其中TBaseClass:BaseClass
{
公共void MyMethod(TBaseClass输入)
{ }
}
我对此有一个术语,希望不是冒犯性的。我称之为普通的疯狂兔子洞。这就是当我们尝试将泛型和继承结合起来,使一组类可以实现一系列越来越令人困惑的目标时所发生的情况,我们通过添加更多泛型参数和更多泛型类来解决这一问题

如果你
-使用

-查看实际使用的类型是什么
GetType()
typeof
,或者
是什么

-让它编译,但不记得它应该做什么这将起作用(我的意思是它编译)

public void MyMethod()
其中T:BaseClass
{ }
这也是:

public void MyMethod<T>()
    where T : ChildClass1
{ }
public void MyMethod()
T:ChildClass1在哪里
{ }

阅读您的评论后进一步编辑

您可以这样做:

public class AnotherClass<TBaseClass, TModel> where TBaseClass : BaseClass<TModel>
{
    public void MyMethod(TBaseClass input)
    { }
}
public类另一个类,其中TBaseClass:BaseClass
{
公共void MyMethod(TBaseClass输入)
{ }
}
我对此有一个术语,希望不是冒犯性的。我称之为普通的疯狂兔子洞。这就是当我们尝试将泛型和继承结合起来,使一组类可以实现一系列越来越令人困惑的目标时所发生的情况,我们通过添加更多泛型参数和更多泛型类来解决这一问题

如果你
-使用

-查看实际使用的类型是什么
GetType()
typeof
,或者
是什么


-让它编译,但不记得它应该做什么

如果我理解正确,请尝试过滤“MyMethod”,使t是“ChildClass…”类型的类

您可以向函数中添加一个通用参数,如下所示:

MyMethod<ChildClass1>();
public void MyMethod<T, U>()
where T : BaseClass<U>
{

}
public void MyMethod()
其中T:BaseClass
{
}
但是你必须用那种方式调用MyMethod

MyMethod<ChildClass1, MyModel1>();
MyMethod();
所以它的使用相当复杂


另一个解决方案是创建一个新的“blank”类:

公共抽象类基类//如果不需要在代码中使用,请将其标记为抽象类
{
}
公共类MyModel1
{
}
公共类MyModel2
{
}
公共类BaseClass:Base//该类继承新类
{
}
公共类ChildClass1:基类
{
}
公共类ChildClass2:基类
{
}
公共类另一类
{
公共方法()
其中T:Base
{
}
}

如果我理解正确,您可以尝试过滤“MyMethod”,使T是“ChildClass…”类型的类

您可以向函数中添加一个通用参数,如下所示:

MyMethod<ChildClass1>();
public void MyMethod<T, U>()
where T : BaseClass<U>
{

}
public void MyMethod()
其中T:BaseClass
{
}
但是你必须用那种方式调用MyMethod

MyMethod<ChildClass1, MyModel1>();
MyMethod();
所以它的使用相当复杂


另一个解决方案是创建一个新的“blank”类:

公共抽象类基类//如果不需要在代码中使用,请将其标记为抽象类
{
}
公共类MyModel1
{
}
公共类MyModel2
{
}
公共类BaseClass:Base//该类继承新类
{
}
公共类ChildClass1:基类
{
}
公共类ChildClass2:基类
{
}
公共类另一类
{
公共方法()
其中T:Base
{
}
}

您的意思是
其中T:BaseClass
?方法也缺少返回类型或无效。已编辑并添加了返回类型。不,看起来,
where T:BaseClass
不是我要找的。你是说
where T:BaseClass
?方法也缺少返回类型或无效。已编辑并添加了返回类型。不,它看起来像,
其中T:BaseClass
不是我想要的。编辑并添加了返回类型。不,它看起来像,
其中T:BaseClass
不是我想要的。编辑并添加了返回类型。不,看起来,
其中T:BaseClass
不是我想要的。是的,它们确实有效。但接下来我需要为所有MyModels(第一种方式)或所有ChildClass(第二种方式)编写MyMethod。这就是为什么我要找一些通用的东西是的,它们确实有用。但接下来我需要为所有MyModels(第一种方式)或所有ChildClass(第二种方式)编写MyMethod。这就是为什么我要找一些通用的汉克斯。我也在考虑同样的事情(创建另一个基类)作为