为什么标有//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);
}
}
答案 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);
}
答案 2 :(得分:1)
由于您使用T
传递了一般类型的对象,编译器不知道您正在使用哪个类 - 尽管它知道,它可能是int
或Application
或其他任何内容。
你可能想要的是让ClassOne
和ClassTwo
继承自另一个具有抽象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