c# -方法参数可以是变量类型的类吗?

本文关键字:类型 变量 方法 参数 | 更新日期: 2023-09-27 17:53:26

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

例如,我有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)

它甚至可能有一个参数谁的类型是未知的,直到运行时?

如果有,我该怎么做?

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

EDIT -我已经编辑了上面的代码,因为我的代码确实传递了一个类的实例,而不仅仅是类名。但是,我仍然得到无效参数消息。

c# -方法参数可以是变量类型的类吗?

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

Type
MyMethod(new ClassA());

MyMethod(typeof(ClassA));

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

MyMethod<ClassA>();

它甚至可能有一个参数谁的类型是未知的,直到运行时?

绝对;object是可以的,但是你需要给这个参数一个有效的值。

需要传递类的实例(对象)。试一试:

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

我建议使用overloading MyMethod,例如:

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

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

可以考虑这样:-

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

您应该按照Richard的建议重载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");
        }
    }
}

如果ClassA和ClassB具有相同的函数签名,则考虑使用interface。如果实现也是相同的,则在基抽象类中实现它们,并在需要时在继承的类中重写它们。

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

实际上错误在这里-

public static void MyMethod(Object obj)

一旦我改变了参数如下:

public static void MyMethod(object obj)