我实际上设法创建了这段代码:
class Foo{
public void test(){
Keyboard.input(this);
}
public void menu(){
Console.WriteLine("This is a menu");
}
}
class Keyboard{
public static string input(object class_name){
new class_name().menu(); //call from dynamic object the method
}
}
你如何看到我有一个名为Foo
的类,其中包含从用户键盘读取一些输入的方法test
,实际上这种方法允许我识别用户是否按下特定键代码调用方法菜单。在这个例子中,它只是调用方法menu
。现在我将类Foo
的实例传递给Keyboard
类,该类具有名为input
的静态方法,此方法应创建传递类的新实例并调用{{1 }} 方法。但实际上我在这一行上遇到了错误:
menu
object是一个对象,但用作类型
我做错了什么?
答案 0 :(得分:2)
由于class_name
是类的实例而不是类型,因此您应该将其强制转换为Foo
类型并调用该函数。
更改
new class_name().menu();
到
((Foo)class_name).menu();
<强>更新强>
如果您希望在多个类上使用它,您应该创建一个interface来继承它们。
// All classes passed into 'Keyboard.Input' should inherit this interface
interface IMenu
{
public void menu();
}
class Foo : IMenu
{
public void test()
{
Keyboard.input(this);
}
public void menu()
{
Console.WriteLine("This is a menu");
}
}
并更改
中的行public static string input(object class_name)
{
new class_name().menu(); //call from dynamic object the method
}
到
public static string input(IMenu class_name)
{
((IMenu)class_name).menu();
return "Something you want to return";
}
答案 1 :(得分:2)
您需要使用带有new
约束的泛型方法,并将menu
方法选择到基本抽象类中:
public abstract class MenuClass
{
public abstract void menu();
}
class Keyboard
{
//if you can pass class name
public static string input<TClassName>() where TClassName : MenuClass, new()
{
new TClassName().menu();
}
//if you can not pass class name
public static string input<TClassName>(TClassName obj) where TClassName : MenuClass, new()
{
new TClassName().menu(); //if you want to create new instance
obj.menu(); //if you want to use already existing object
}
}
如果可以传递所需的类名,可以使用第一种方法,如果不能,则可以使用第二种方法而不使用泛型参数:
Keyboard.input(yourObj);
编译器将自动从使用中获取类型参数
<强>更新强>
由于您没有抽象类或接口,因此在调用方法之前应将对象强制转换为必需的类:
public static string input(object class_name){
if (class_name as Foo != null)
{
((Foo)class_name).menu();
}
}
或者如果您不知道对象的输入类型并且不能使用泛型,但是您应该创建同一个类的新实例,请使用反射:
public static string input(object class_name){
if (class_name != null)
{
Foo newObj = Activator.CreateInstance(class_name.GetType());
newObj.menu();
}
}