泛类型对象属性赋值出错
子类调用基类方法,得到的却是错误的值。
基类中Add方法将对象属性赋了值,但在子类中却 得不到这个值。
代码如下:
泛类型继承 泛类型 继承 --------------------编程问答-------------------- 把你的调用方法写出来,谁访问不了谁 --------------------编程问答--------------------
public class A
{
public int Id { get; set; }
}
public class B : A
{
public string Name { get; set; }
}
public class Tree<M>
where M : A
{
protected virtual M Add()
{
//db 是 Entities
var item = db.Set<M>().Create();
item.Id = 100;
return item;
}
}
public class Test : Tree<B>
{
public void F()
{
var item = base.Add();
item.Name = string.Format("Id = {0}",item.Id);
//item.Name : "Id = 0"
}
}
--------------------编程问答-------------------- 就是这样的,为什么item.Id 是 0呢?base.Add()中已经将Id值=100了啊 --------------------编程问答-------------------- LZ, 我不清楚你那个 db.Set<T>() 方法是怎么做的,会不会是那里出了问题?
public class Test : Tree<B>
{
public string F()
{
var item = base.Add();
item.Name = string.Format("Id = {0}",item.Id);
//item.Name : "Id = 0"
return item.Name;
}
}
我测试了一下,因为不清楚 db 的东西,这部分我换成了其他方式,得到的结果是 Id = 100:
--------------------编程问答--------------------
public class A
{
public int Id { get; set; }
public virtual A Create()
{
return new A();
}
}
public class B : A
{
public string Name { get; set; }
public override A Create()
{
return new B();
}
}
public class Tree<M> where M : A, new()
{
protected virtual M Add()
{
var item = new M();
item.Id = 100;
return item;
}
}
public class Test : Tree<B>
{
public void F()
{
var item = base.Add();
item.Name = string.Format("Id = {0}", item.Id);
Console.WriteLine(item.Name);
}
}
class Program
{
static void Main(string[] args)
{
try
{
new Test().F();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.ReadKey();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
public class A
{
public int Id { get; set; }
}
public class B : A
{
public string Name { get; set; }
}
public class Tree<M>
where M : A
{
protected virtual M Add()
{
var item = new B() as M;
item.Id = 100;
return item;
}
}
public class Test : Tree<B>
{
public void F()
{
var item = base.Add();
item.Name = string.Format("Id = {0}", item.Id);
Console.WriteLine(item.Name);
}
}
class Program
{
static void Main(string[] args)
{
Test t = new Test();
t.F();
}
}
}
输出100。没问题。 --------------------编程问答-------------------- 问题找到了
之前代码,出错代码
public class A
{
public int Id { get; set; }
}
public B : A
{
public int Id { get; set; }
public string Name { get; set; }
}
之后代码:问题解决
public class A
{
public virtual int Id { get; set; }
}
public B : A
{
public override int Id { get; set; }
public string Name { get; set; }
}
原因:B重写了A的Id,导致在Tree中定义的方法实际上修改的是A的Id,而非实参B的Id
谢谢caozhy。问题解决了。 --------------------编程问答-------------------- 晕,你给的代码原先不是那样的,是这样的:
public class A
{
public int Id { get; set; }
}
public B : A
{
// public int Id { get; set; } 这个没有
public string Name { get; set; }
}
按照你给的代码都是正确的,你所谓的解决了,那是多此一举,你这样的 override 和没有 override 没有区别。
补充:.NET技术 , C#