c#中的泛型问题

时间:2012-07-24 13:20:43

标签: c# generics

我在现有结构中添加新类时遇到问题。我将尽可能清楚地解释我的问题

public interface Imust
{
    string Name { get; set; }
    string File { get; set; }
    string RowKey { get; set; }
    string Time { get; set; }
    string PartitionKey { get; set; }
}

public class TA : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}

public class TB : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}

public class TC : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}    

public class _Table <T> : _Account where T : Imust 
{
}

这里将上述3个类实现为Tables及其属性作为我项目中的列。 Imust接口在每个类中实现,因为在泛型类中我设置了接口约束。 TableServiceEntity类包含RowKey和PartitionKey的实现。此类也在所有3个实体中继承。

问题:现在我必须在我的应用程序中添加一个新表。所以为此,我必须在这里添加一个新类

public class TD : TableServiceEntity
{

}    

我不希望这个类实现Imust接口,因为它不包含这些列。但我必须将它作为参数传递给泛型类_Table。因为这个新类具有不同的列,但它执行与其他3个实体相同的功能。现在,我将如何在保持现有结构的同时添加这个新类?

请为我提出更好的解决方案吗?

修改

是的我可以将约束TableServiceEntity作为基类。但是在泛型类_Table中,很少有函数在File属性上运行,如

    public T AccessEntity(string Id = "0", string File = "0")
    {
        return (from e in ServiceContext.CreateQuery<T>(TableName)
                where e.RowKey == Id || e.File == File
                select e).FirstOrDefault();
    }

如果我删除了此接口约束,则会显示错误T does not have a defination for File

5 个答案:

答案 0 :(得分:1)

我这样做...接口在你的声明中没有任何意义,因为表的更通用的类型是TableServiceEntity

public class _Table <T> : _Account where T : TableServiceEntity
{
}

答案 1 :(得分:1)

将界面拆分为两个:

public interface Ibase

    string RowKey { get; set; }
    string PartitionKey { get; set; }
}

public interface Imust : Ibase
{
    string Name { get; set; }
    string File { get; set; }
    string Time { get; set; }
}

public class TA : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}

public class TB : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}

public class TC : TableServiceEntity, Imust
{
    public string Time { get; set; }
    public string Name { get; set; }
    public string File { get; set; }
}    


public class _BaseTable <T> : _Account where T : Ibase 
{
}

public class _Table <T> : _BaseTable<T> where T : Imust 
{
}

并在_BaseTable中实施常见功能,并在Time中针对NameFile_Table实施。

在您完成问题之后,您可以更加直观地进行编辑。依赖于_BaseTableFileName的{​​{1}}中的Thos方法可以在Time中标记为抽象和覆盖。

答案 2 :(得分:0)

为什么不让_Table成为<TableServiceEntity>类型?显然,你破坏了你的界面,所以你不能继续使用它作为通用的,因为不是每个类都是那个界面的?

答案 3 :(得分:0)

  1. 您有3个类别(TA,TB和TC)完全相同。你为什么不上一节课?
  2. 对于行为(即方法),请使用界面。对于结构(即属性),请使用继承(例如TableServiceEntity)。
  3. 使TD继承自基类,但不实现接口。
  4. _Table的限制更改为where T : TableServiceEntity
  5. 此致

答案 4 :(得分:0)

更新以反映海报的其他信息:

您需要指定一个新界面:

public interface IMust2 {
    public string File {get;set;}
    public string Rowkey {get;set;

}

修改IMust以继承自IMust2

public interface IMust : IMust2 
{
   public string Name {get;set;}
   public string Time {get;set;}
   public string PartitoinKey {get;set;}
}