我在现有结构中添加新类时遇到问题。我将尽可能清楚地解释我的问题
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
。
答案 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
中针对Name
,File
和_Table
实施。
在您完成问题之后,您可以更加直观地进行编辑。依赖于_BaseTable
,File
或Name
的{{1}}中的Thos方法可以在Time
中标记为抽象和覆盖。
答案 2 :(得分:0)
为什么不让_Table成为<TableServiceEntity>
类型?显然,你破坏了你的界面,所以你不能继续使用它作为通用的,因为不是每个类都是那个界面的?
答案 3 :(得分:0)
TableServiceEntity
)。 _Table
的限制更改为where T : TableServiceEntity
此致
答案 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;}
}