Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET2.0:使用反射和泛型调用方法会导致异常_C#_.net_Generics_Reflection_.net 2.0 - Fatal编程技术网

C# .NET2.0:使用反射和泛型调用方法会导致异常

C# .NET2.0:使用反射和泛型调用方法会导致异常,c#,.net,generics,reflection,.net-2.0,C#,.net,Generics,Reflection,.net 2.0,我不熟悉堆栈溢出,所以请原谅我。我刚开始过渡到C#,我遇到了一个问题 我想传入一个泛型类并从该类调用一个方法。因此,我的代码如下所示: public void UpdateRecords<T>(T sender) where T : new() //where T: new() came from Resharper { Type foo = Type.GetType(sender.GetType().ToString()); object[] userParamet

我不熟悉堆栈溢出,所以请原谅我。我刚开始过渡到C#,我遇到了一个问题

我想传入一个泛型类并从该类调用一个方法。因此,我的代码如下所示:

public void UpdateRecords<T>(T sender) where T : new() //where T: new() came from Resharper
{
    Type foo = Type.GetType(sender.GetType().ToString());
    object[] userParameters = new object[2];
    userParameters[0] = x;
    userParameters[1] = y;
    sender = new T(); //This was to see if I could solve my exception problem
    MethodInfo populateRecord = foo.GetMethod("MethodInOtherClass");
    populateMethod.Invoke(sender, userParameters);
}
public void UpdateRecords(T sender),其中T:new()//其中T:new()来自Resharper
{
类型foo=Type.GetType(sender.GetType().ToString());
object[]userParameters=新对象[2];
用户参数[0]=x;
用户参数[1]=y;
sender=new T();//这是为了看看是否可以解决异常问题
MethodInfo populateRecord=foo.GetMethod(“MethodInOtherClass”);
调用(发送方、用户参数);
}
引发异常:“对象引用未设置为对象的实例。”


再次,我真的很抱歉,因为我几乎是C#的新手,这是我第一次处理反射和泛型。谢谢大家!

您只需执行此操作即可获得类型:

Type foo = typeof(T);
您没有指定获取NullReferenceException的位置,但我想知道foo是否返回为null…

sender.GetType().ToString()
返回类型名,而不返回程序集名

Type.GetType
需要一个类型名和程序集名(除非该类型在正在执行的程序集或mscorlib中)。如果找不到类型(例如,由于缺少程序集名称),它将返回空引用


尝试将代码更改为

Type foo = sender.GetType();
甚至只是

Type foo = typeof(T);

首先,我建议在调试器中运行这段代码,并打开一个“Break on Exception”,以帮助隔离导致错误的行。这是一种有用的调试技术,可以帮助您在将来更快地发现这些类型的问题。转到VS中的
Debug>>异常
,并选中
抛出
列中的
公共语言运行时异常
复选框

现在开始讨论您的问题。很可能是
发送方
作为
null
传入,如果是这样,行:

Type foo = Type.GetType(sender.GetType().ToString()); 
将抛出一个
NullReferenceException
。相反,您可以使用:

Type foo = typeof(T); 
它标识泛型参数的类型,而不需要泛型参数的实例

现在,如果不了解更多关于代码试图做什么的信息,就不可能确定实例化
T
的实例是否正确。仅仅因为ReSharper建议在其中添加
T:new()
并不意味着它是合适的-除非您知道这是正确的行为

最后,我不知道使用反射调用其他类中的
方法是否有令人信服的理由,也许有。但是,由于您是C#的新手,我要提到,如果类型
T
始终是某个基本类型
a
的子类,或者始终实现某个包含要调用的方法的接口
I
,那么您可以简单地应用泛型约束,让编译器知道这一点。然后,您可以调用该方法,而无需恢复到使用反射:

public void UpdateRecords<T>(T sender) 
   where T : SomeBaseClass_Or_SomeInterface_ThatDefinesMethod
{
  sender = new T();
  sender.MethodInOtherClass( x, y );
}
公共作废更新记录(T发送方)
其中T:SomeBaseClass\u或SomeInterface\u定义了方法
{
sender=newt();
另一类(x,y);
}
好多了

最后一点意见。将一个参数传递给一个方法,然后完全忽略它是不寻常的——只在方法中实例化一个实例。在某些情况下,这是合适的,但我倾向于将其视为一种选择。如果可能的话,我会尝试去掉
发送方
参数,或者将代码更改为先测试它是否为null,然后才实例化。

或者:

  • sender
    为空,因此
    sender.GetType()
    将失败
  • foo.GetMethod(“MethodInOtherClass”)
    返回null,因此
    populateMethod.Invoke()
    将失败
  • MethodInOtherClass
    依赖于某些先决条件(非空引用),因此当这些先决条件不存在时,它将失败

  • 异常具体在哪里抛出?