C# .NET2.0:使用反射和泛型调用方法会导致异常
我不熟悉堆栈溢出,所以请原谅我。我刚开始过渡到C#,我遇到了一个问题 我想传入一个泛型类并从该类调用一个方法。因此,我的代码如下所示: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
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
依赖于某些先决条件(非空引用),因此当这些先决条件不存在时,它将失败
异常具体在哪里抛出?