C# - 方法参数可以是一类变量类型吗?

时间:2013-01-16 09:31:43

标签: c#

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

例如,假设我有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参数消息。

6 个答案:

答案 0 :(得分:2)

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

MyMethod(new ClassA());

MyMethod(typeof(ClassA));

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

MyMethod<ClassA>();
  

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

绝对; object没问题,但你需要给该参数一个有效的值。

答案 1 :(得分:1)

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

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

我建议overloading MyMethod,例如:

public void MyMethod(ClassA a) { ... }
punlic void MyMethod(ClassB b) { ... }

答案 2 :(得分:0)

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

请考虑一下: -

var test = new ClassA();
MyMethod(test);

答案 3 :(得分: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");
        }
    }
}

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

实际上错误就在这里 -

public static void MyMethod(Object obj)

我按如下方式更改了参数:

public static void MyMethod(object obj)

它运作良好:)