如何从泛型方法调用另一个类中的方法?

时间:2014-05-16 20:13:21

标签: c#

为什么标有//Dont work in the bottom of the code的行没有编译?

我想将WriteMessage方法重用于不同的类,我尝试使用generics,但我不确定如何使用它。

class ClassOne
{
    public string MethodOne()
    {
        return ("ClassOne");
    }

    public string MethodTwo()
    {
        return ("ClassOne -MethodTwo ");
    }
}

class ClassTwo 
{
    public string MethodOne()
    {
        return ("ClassTwo");
    }

    public string MethodTwo()
    {
        return ("ClassOne -MethodTwo ");
    }
}

class Program
{
    private static void Main()
    {
        var objectOne = new ClassOne();
        WriteMessage(objectOne);

        var objectTwo = new ClassTwo();
        WriteMessage(objectTwo);
        Console.ReadKey();
    }

    public static void WriteMessage<T>(T objectA)
    {
        var text = objectA.MethodTwo();  //Dont Work
        Console.WriteLine("Text:{0}", text);
    }
}

3 个答案:

答案 0 :(得分:4)

尝试实现界面:

示例:

public interface IHasTwoMethods
{
 string MethodOne()
 string MethodTwo()
}

在您的课程上实现此接口:

class ClassOne : IHasTwoMethods
class ClassTwo : IHasTwoMethods

然后在你的通用方法中这样做:

public static void WriteMessage<T>(T objectA) where T : IHasTwoMethods
    {
        var text = objectA.MethodTwo();  //Will work
        Console.WriteLine("Text:{0}", text);
    }

您可以在此处详细了解界面:http://msdn.microsoft.com/en-us/library/87d83y5b.aspx

答案 1 :(得分:2)

这不能编译,因为就编译器而言objectA只是Object

要实现此功能,您需要使用泛型类型约束

public interface MyInterface
{
   string MethodTwo();
}

public class A : MyInterface
{
   ...
}

public class B : MyInterface
{
   ...
}

public static void WriteMessage<T>(T objectA) where T: MyInterface
{
    var text = objectA.MethodTwo();  //Will Work!
    Console.WriteLine("Text:{0}", text);
}

MSDN:Constraints on Type Parameters

答案 2 :(得分:1)

由于您使用T传递了一般类型的对象,编译器不知道您正在使用哪个类 - 尽管它知道,它可能是intApplication或其他任何内容。

你可能想要的是让ClassOneClassTwo继承自另一个具有抽象MethodTwo类的类,这些类都可以实现。有点像...

abstract class SuperClass
{
    public abstract string MethodOne();
}

class ClassOne : SuperClass
{
    public override string MethodOne()
    {
        return ("ClassOne");
    }
}

然后在Main:

public static void WriteMessage<T>(T objectA) where T : SuperClass
{
    var text = objectA.MethodOne();
    Console.WriteLine("Text:{0}", text);
}

在此处阅读C#继承:http://msdn.microsoft.com/en-us/library/ms173149.aspx