如何访问封闭泛型类的属性T.

时间:2012-04-02 11:33:14

标签: generics properties c#-3.0

给出一个开放的泛型类定义:

public abstract class BaseUI<T> : INotifyPropertyChanged, IChangeTracking, IDataErrorInfo, ISelectable
    where T: new()
{
    public BaseUI()
    {
    }
    public BaseUI(T data)
    {
        // initialization
    }
}

和一个封闭的实现:

public class AccountUI : BaseUI<Account>
{
    public AccountIU()
       : base()
    {

    }
    public AccountUI(Account data)
    : base(data)
    {

    }
}

如何访问T / Account的属性?这是否可能在3.5(即没有动态)

1 个答案:

答案 0 :(得分:0)

您可以通过类型为T的基类的任何可访问成员(或者当然,通过类型为Account的派生类的任何成员)在派生类中访问这些属性。

(抽象类型的公共构造函数没有意义,因此我将这些更改为受保护。)

例如,假设Account类型具有布尔IsOverdue属性:

public abstract class BaseUI<T> : INotifyPropertyChanged, IChangeTracking, IDataErrorInfo, ISelectable 
    where T: new() 
{ 
    protected BaseUI() {} 
    protected BaseUI(T data) { this.Data = data; } 

    protected T Data { get; private set; }
} 

public class AccountUI : BaseUI<Account>   
{   
    public AccountUI() : base() {}
    public AccountUI(Account data) : base(data) {}

    public void SomeMethod()
    {
        if (this.Data.IsOverdue)
        {
            //... handle overdue account
        }
    }
}   

现在,可能存在一个在泛型上下文中引用BaseUI<T>的情况,因此您不知道在编译时类型参数是什么。在这种情况下,您需要在基类中使用抽象方法:

public abstract class BaseUI<T> : INotifyPropertyChanged, IChangeTracking, IDataErrorInfo, ISelectable 
    where T: new() 
{ 
    protected BaseUI() {} 
    protected BaseUI(T data) { this.Data = data; } 

    protected T Data { get; private set; }

    public abstract void SomeMethod();
} 

在此示例中,您需要将override关键字添加到AccountUI.SomeMethod的声明中:

public class AccountUI : BaseUI<Account>   
{   
    public AccountUI() : base() {}
    public AccountUI(Account data) : base(data) {}

    public override void SomeMethod()
    {
        if (this.Data.IsOverdue)
        {
            //... handle overdue account
        }
    }
}   

现在,您可以在对SomeMethod的任何引用上致电BaseUI<T>。派生类负责提供实现。与第一个示例一样,派生类知道为T提供的类型参数,因此它可以使用该类型的可访问成员。