当前位置:编程学习 > C#/ASP.NET >>

泛类型对象属性赋值出错


子类调用基类方法,得到的却是错误的值。

基类中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"
        }
    }
泛类型继承  泛类型 继承 --------------------编程问答-------------------- 把你的调用方法写出来,谁访问不了谁 --------------------编程问答--------------------

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;
        }
    }
--------------------编程问答-------------------- 就是这样的,为什么item.Id 是 0呢?base.Add()中已经将Id值=100了啊 --------------------编程问答-------------------- LZ, 我不清楚你那个 db.Set<T>() 方法是怎么做的,会不会是那里出了问题?
我测试了一下,因为不清楚 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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,