C#子类丢失属性值
由于几天前的一个问题(你可以查看这篇文章),我需要创建一种方法,使我的一些linq到sql表能够被动态引用。我已经通过一个抽象的LogTable类实现了这一点,它包含了我的DataTable上定义的所有LogTable属性。我之所以能够用这种抽象的方式,是因为我的日志表具有相同的结构,因此具有相同的属性 以下是简化代码: 抽象基类 更新日志表的My(简化)动态方法:C#子类丢失属性值,c#,generics,exception,abstract-class,C#,Generics,Exception,Abstract Class,由于几天前的一个问题(你可以查看这篇文章),我需要创建一种方法,使我的一些linq到sql表能够被动态引用。我已经通过一个抽象的LogTable类实现了这一点,它包含了我的DataTable上定义的所有LogTable属性。我之所以能够用这种抽象的方式,是因为我的日志表具有相同的结构,因此具有相同的属性 以下是简化代码: 抽象基类 更新日志表的My(简化)动态方法: public void UpdateLog<T>(T currentLOG) where T : LogTableSt
public void UpdateLog<T>(T currentLOG) where T : LogTableStructure
{
LogTableStructure logStructure = null;
//LogTableEnum is defined on this class constructor
switch (LogTableEnum)
{
case LogTableEnum.Log2009:
logStructure = this.factory.LogDB.LOG_2009s
.SingleOrDefault(q => q.ID == currentLOG.ID);
break;
case LogTableEnum.Log2010:
logStructure = this.factory.LogDB.LOG_2010s
.SingleOrDefault(q => q.ID == currentLOG.ID);
break;
case LogTableEnum.Log2011:
logStructure = this.factory.LogDB.LOG_2011s
.SingleOrDefault(q => q.ID == currentLOG.ID);
break;
}
}
public void UpdateLog(T currentLOG),其中T:LogTableStructure
{
LogTableStructure logStructure=null;
//LogTableEnum在此类构造函数上定义
开关(LogTableEnum)
{
案例LogTableEnum.Log2009:
logStructure=this.factory.LogDB.LOG_2009s
.SingleOrDefault(q=>q.ID==currentLOG.ID);
打破
案例LogTableEnum.Log2010:
logStructure=this.factory.LogDB.LOG\u 2010s
.SingleOrDefault(q=>q.ID==currentLOG.ID);
打破
案例LogTableEnum.Log2011:
logStructure=this.factory.LogDB.LOG_2011s
.SingleOrDefault(q=>q.ID==currentLOG.ID);
打破
}
}
问题
出于某种原因,currentLOG参数抛出运行时null引用异常,即使它已填充了所有日志表属性。通过使用vs2010 debbuger,我注意到当currentLOG属性被填充时,基类(LogTableStructure)属性都是空的,就好像基类对象是空的一样
我是不是忘记了关于成员隐藏继承或类似的东西?我甚至在.dbml上的所有日志表属性中添加了
新的
修饰符,但即使这样也没有解决问题您的排序似乎有误。将null赋值给logStructure,然后从中调用InjectFrom。只有这样,您才能将工厂创建的实例分配给该变量。您的排序似乎有误。将null赋值给logStructure,然后从中调用InjectFrom。只有这样,才能将工厂创建的实例分配给该变量。只需将实际实例注入到对象中:
// This object is going to have to be a class that inherits from your abstract class
// It can't be a null object of the type of your abstract class.
var logStructure = new InstanceOfLogTableStructure();
logStructure.InjectFrom(currentLOG);
这样就可以了。只需创建要向其中注入实际实例的对象:
// This object is going to have to be a class that inherits from your abstract class
// It can't be a null object of the type of your abstract class.
var logStructure = new InstanceOfLogTableStructure();
logStructure.InjectFrom(currentLOG);
应该可以了。你能举一个调用
UpdateLog
方法的代码示例吗?另外,您在哪里定义要注入的ocorreciabanco
对象?什么是ocorreciabanco
?为什么要声明一个logStructure
变量,然后忽略它?“currentLOG参数抛出[…]”是什么意思?(参数本身不能引发异常-只有access可以。)您知道上一个case语句中的输入错误吗?我猜应该是Log2011。LogTableStructure logStructure=null;logStructure.InjectFrom(currentLOG)你有没有想过要工作?如果它是一个普通的方法,那么它会抛出一个异常,如果它是一个扩展方法,那么它不会做任何有用的事情…@AdrianoRR:那么我建议你看看TargetInvocationException中的嵌套异常。你能给出一个调用UpdateLog
方法的代码示例吗?另外,您在哪里定义要注入的ocorreciabanco
对象?什么是ocorreciabanco
?为什么要声明一个logStructure
变量,然后忽略它?“currentLOG参数抛出[…]”是什么意思?(参数本身不能引发异常-只有access可以。)您知道上一个case语句中的输入错误吗?我猜应该是Log2011。LogTableStructure logStructure=null;logStructure.InjectFrom(currentLOG)你有没有想过要工作?如果它是一个普通的方法,看起来会抛出一个异常,如果它是一个扩展方法,则不会做任何有用的事情…@AdrianoRR:那么我建议你看看TargetInvocationException.LogTableStructure中的嵌套异常是一个抽象类,我无法实例化它。很抱歉……你需要实例化一些类。您不能注入抽象类的空实例。我已将抽象类转换为commom类,以便可以注入它。猜猜看,由于某种原因,即使所有日志表属性都为null,我也可以更新我的值。我不喜欢使用我不了解其行为的代码,因此我将继续寻找更好的解决方案。无论如何,谢谢。ValueInjector(或任何类似automapper的实用程序)的工作方式是,它使用反射来比较类的两个实例的属性和值。最初的代码试图声明抽象类类型的变量,但没有实际的类实例ValueInjector没有任何要检查的值。你已经改变了你的帖子,我不知道你现在在哪里做注射,但希望这个解释能给我一些启示。是的,它给我的问题带来了启示:)好吧,既然我似乎无法正确解释问题是什么(它还不完美),我想我稍后会尝试发布一个printScreen。LogTableStructure是一个抽象类,我不能实例化它。很抱歉…你需要实例化一些类。您不能注入抽象类的空实例。我已将抽象类转换为commom类,以便可以注入它。猜猜看,由于某种原因,即使所有日志表属性都为null,我也可以更新我的值。我不喜欢使用我不了解其行为的代码,因此我将继续寻找更好的解决方案。无论如何,谢谢。ValueInjector(或任何类似automapper的实用程序)的工作方式是,它使用反射来比较类的两个实例的属性和值。您的初始代码正在尝试反编译