如何告诉C#查看属性的对象基类?

时间:2009-07-10 09:14:35

标签: c# generics inheritance

我在指定的行中收到错误“ T不包含Id 的定义”,即使在我调试时,我看到“item”确实< / strong>在 基类 中有属性“Id”。

我如何在此指定我希望C#查看项目的Id基类(为什么不自动执行此操作?)?

//public abstract class Items<T> : ItemBase (causes same error)
public abstract class Items<T> where T : ItemBase
{
    public List<T> _collection = new List<T>();
    public List<T> Collection
    {
        get
        {
            return _collection;
        }
    }

    public int GetNextId()
    {
        int highestId = 0;
        foreach (T item in _collection)
        {
           //ERROR: "T does not contain a definition for Id
           if (item.Id > highestId) highestId = item.Id; 
        }

        return highestId;
    }

}

以下是如何定义类:

public class SmartForm : Item
{
    public string IdCode { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public int LabelWidth { get; set; }
    public int FormWidth { get; set; }
    ...


public abstract class Item : ItemBase
{
    public int Id { get; set; }
    public DateTime WhenCreated { get; set; }
    public string ItemOwner { get; set; }
    public string PublishStatus { get; set; }
    public int CorrectionOfId { get; set; }
    ...

6 个答案:

答案 0 :(得分:12)

你的问题是T没有约束,因此,在编译时,所有编译器都知道T是某种对象。如果您知道T将始终继承的类型,则可以向类定义添加通用约束:

public abstract class Items<T> : ItemBase where T : Item
{
//....
}

当你调试时,T被实例化为具有Id属性的Item(或子类),但是编译器在编译时不知道,因此错误。

答案 1 :(得分:4)

你的通用约束错了。

public abstract class Items<T> : ItemBase

应该是:

public abstract class Items<T> where T : ItemBase

发生的事情是,当您的课程中有一系列项目时,您的ItemBaseT

无关

答案 2 :(得分:4)

因为T可能绝对是任何东西,而C#意味着类型安全。对T具有id属性的类型使用约束,你应该没问题。有关详细信息,请参阅here

答案 3 :(得分:1)

您必须指定T始终使用where子句从ItemBase派生。

答案 4 :(得分:1)

你不小心让Items继承了ItemBase,而不是T继承ItemBase。 只需改变

: ItemBase

where T : ItemBase

答案 5 :(得分:-1)

这可能会有所帮助: - )

   foreach (ItemBase item in _collection)
    {
       if (item.Id > highestId) highestId = (Item)item.Id; 
    }