这是一段代码示例,我试图将var类型变量作为参考参数发送给另一个函数。
Type type = Type.GetType(te1.GetValue("class1"));
MethodInfo method = type.GetMethod("fnc1");
var obj1 = Activator.CreateInstance(type);
我不能使用(class1)Activator.CreateInstance(type),因为变量class1将在运行时决定。这就是我在这里使用反射的原因。
method.Invoke(obj1, new object[] { });
class2 cls2= new class2 ();
cls2.fnc2(ref obj1);//getting error 'cannot convert object to class type'
我得到错误,因为fnc2函数接收参数作为class1的类型。
public string fnc2(ref class1 obj3)
{
}
我怎么能处理这个?我需要使用反射将参数作为class1的类型。所以我使用了var类型。我不能使用动态,因为我使用框架3.5。
我的要求是创建class1>>的对象执行class1>>的函数保留对象并将该对象传递给class2的另一个函数并在那里进行处理。名称class1和class2将动态决定,不能进行硬编码。
答案 0 :(得分:3)
var
is not a type。相反,它告诉编译器“自动确定类型”(并保存键入)。将鼠标悬停在下一行的obj1
上,Visual Studio将弹出一个方便的小方框,说明实际类型被解析为什么 - 因为错误消息表明这是,好吧,对象
(在更新问题后,以下某些内容可能已过时,但适用相同的原则 - 表达式必须转换为适当的类型,必须在编译时确定,然后才能在可以用作除Object之外的任何东西。)
“解决方案”只是为了转换Activator结果的结果(因为我们知道是这种情况):
var obj1 = (class1)Activator.CreateInstance(type);
// same as: class1 obj1 = (class1)..
然而,既然我们知道这一点,那么我们可以避免所有这些并使用以下内容,这很无聊:
var obj1 = new class1();
// same as: class1 obj1 = new class1();
所以,现在到了Y问题:这对于任意类型无法完成,而 需要 。编译器已知的类型可以在代码中使用,必须在编译时知道;它们无法从运行时值直接解析。
答案 1 :(得分:0)
如果您确定obj1
的类型属于fnc2
所期望的类型,那么您可以使用这样的反射:
Type type = Type.GetType(te1.GetValue("class1"));
MethodInfo method = type.GetMethod("fnc1");
object obj1 = Activator.CreateInstance(type);
method.Invoke(obj1, new object[] {});
class2 cls2 = new class2();
cls2.GetType().GetMethod("fnc2").Invoke(cls2, new[] {obj1});
这将检索名为fnc2
的方法(假设其中只有一个具有该名称,没有重载),并使用obj1
调用它。如果存在重载,则需要此GetMethod variant。
在旁注中,在这种情况下使用var实际上并没有那么有用。为清楚起见,我认为您应该使用object
。