如何将类实例传递给静态方法?

时间:2016-03-24 11:43:22

标签: c#

我实际上设法创建了这段代码:

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是一个对象,但用作类型

我做错了什么?

2 个答案:

答案 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();
        }
 }