将var类型变量传递给函数作为引用?

时间:2014-09-05 05:25:50

标签: c# asp.net reflection var

这是一段代码示例,我试图将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将动态决定,不能进行硬编码。

2 个答案:

答案 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