0

我有一个静态方法,其内部代码能够处理多个不同的类。但是我不确定如何在运行时将类放入方法中。

例如,假设我有 ClassA 和 ClassB

我的方法可以与这些类中的任何一个一起使用,因此我希望参数看起来像这样。

public static void MyMethod(Object obj)
{
    //...obj is either ClassA or ClassB
    //...do work on variable class
}

但是当我尝试任何一个时,我都会收到无效的参数消息

ClassA a = new ClassA();
MyMethod(a);

ClassB b = new ClassB();
MyMethod(b)

甚至可能有一个参数在运行时之前的类型是未知的?

如果是这样,我该怎么做?

如果没有,如何以这种方式利用在许多类上执行某些功能的方法,而不在每个类中重复方法代码?

编辑 - 我已经编辑了上面的内容,因为我的代码确实传递了一个类的实例,而不仅仅是类名。但是我仍然收到 Invalid argument 消息。

4

6 回答 6

2

假设ClassA是类型名称,那么该语法无效;您必须传入类型的实例或类型的实例Type

MyMethod(new ClassA());

或者

MyMethod(typeof(ClassA));

对于后一种情况,您还可以考虑重构以使用泛型:

MyMethod<ClassA>();

甚至可能有一个参数在运行时之前的类型是未知的?

绝对地; object会很好,但你需要给那个参数一个有效的值。

于 2013-01-16T09:34:02.063 回答
1

您需要传递该类的实例(对象)。尝试:

MyMethod(new ClassA());
MyMethod(new ClassB());

我建议overloading使用 MyMethod,例如:

public void MyMethod(ClassA a) { ... }
punlic void MyMethod(ClassB b) { ... }
于 2013-01-16T09:35:49.993 回答
0

实际上错误就在这里-

public static void MyMethod(Object obj)

一旦我将参数更改如下:

public static void MyMethod(object obj)

它工作得很好:)

于 2013-01-16T10:37:37.107 回答
0

您正在传递一个类型,而不是一个类型的实例。

考虑一下这个: -

var test = new ClassA();
MyMethod(test);
于 2013-01-16T09:34:14.770 回答
0

你应该按照理查德的建议重载MyMethod

如果您仍想只使用一种方法定义,则可以使用以下内容:

public static void UnknownArgumentsMethod2(params object[] list)
{
    foreach (object o in list)
    {
        if (o.GetType() == typeof(int))
        {
            Console.WriteLine("This is an integer: " + (int)o);
        }
        else if (o.GetType() == typeof(ClassA))
        {
            Console.WriteLine("This is an object of ClassA");
        }
    }
}
于 2013-01-16T09:38:27.707 回答
0

如果 ClassA 和 ClassB 具有相同的函数签名,请考虑使用接口。如果实现也相同,则在基本抽象类中实现它们,并在需要时在继承类中覆盖它们。

interface IMyInterface
{
    void MethodX();
}

abstract class ClassBase: IMyInterface
{
    public virtual void MethodX()
    {
        Console.WriteLine("MethodX from base class");
    }
}

// this will use base class implementation of MethodX
class ClassA : ClassBase
{
}

class ClassB : Classbase
{
    public void MethodX()
    {
         Console.WriteLine("MethodX from ClassB");
    }
}


class Foo
{
    public void MyMethod(IMyInterface obj)
    {
        obj.MethodX();
    }
}



Foo f = new Foo();

IMyInterface ca = new ClassA();
f.MyMethod(ca);  // This Print MethodX from ClassA, in this case BaseClass

IMyInterface cb = new ClassB();
f.MyMethod(cb);  // This Print MethodX from ClassB
于 2013-01-16T09:45:12.753 回答