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 -我已经编辑了上面的代码,因为我的代码确实传递了一个类的实例,而不仅仅是类名。但是,我仍然得到无效参数消息。
假设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)