我有一个静态方法,其内部代码能够处理多个不同的类。但是我不确定如何在运行时将类放入方法中。
例如,假设我有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参数消息。
答案 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)
它运作良好:)