使用泛型类型声明方法

时间:2017-06-05 16:34:19

标签: c# generics

我在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..>
    {

    }
}

我的问题是,如果我想像这样调用MyMethod,那么声明MyMethod的正确语法是什么:

MyMethod<ChildClass1>();

3 个答案:

答案 0 :(得分:0)

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

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

}

答案 1 :(得分:0)

这将起作用(我的意思是它编译)

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

这样做:

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

阅读评论后进一步编辑......

你可以这样做:

public class AnotherClass<TBaseClass, TModel> where TBaseClass : BaseClass<TModel>
{
    public void MyMethod(TBaseClass input)
    { }
}

我有一个这个词,希望是非攻击性的。我称之为疯狂的通用兔子洞。当我们尝试将泛型和继承结合起来以便一组类可以实现一组变得越来越混乱的广泛目标时,就会发生这种情况,我们通过添加更多通用参数和更通用的类来解决它。

如果你到了洞,你会到达洞的底部 - 使用<dynamic>
- 检查使用GetType()typeofis的实际类型 - 让它编译,但不记得它应该做什么

答案 2 :(得分:0)

如果我理解正确,你会尝试过滤“MyMethod”,以便T是“ChildClass ...”类型的类。

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

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

}

但是你必须以这种方式打电话给MyMethod。

MyMethod<ChildClass1, MyModel1>();

因此使用它非常复杂。

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

public abstract class  Base // mark it as abstract if you don't need to use it in your code
{
}

public class MyModel1
{
}

public class MyModel2
{
}

public class BaseClass<T> : Base //The class inherits the new class
{
}

public class ChildClass1 : BaseClass<MyModel1>
{
}

public class ChildClass2 : BaseClass<MyModel2>
{
}

public class AnotherClass
{
    public void MyMethod<T>()
    where T : Base
    {
    }
}