实现接口并使用现有接口实现的代码

时间:2013-08-28 12:28:56

标签: c# azure interface

我正在尝试实现ITableEntity接口,以便我可以在其上添加[DataContract]属性。但是,如果我自己实现此界面,则必须将ReadEntityWriteEntity方法设为正文。

但是有一个类已经实现了ITableEntity接口,并为ReadEntityWriteEntity方法提供了一个正文TableEntity.cs

如何使用TableEntity类中的方法实现接口的实现?

[编辑]

[DataContract]
public class SerializableTableEntity : ITableEntity 
{
    private TableEntity tableEntity;

    public string ETag { get; set; }
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public DateTimeOffset Timestamp { get; set; }

    public SerializableTableEntity()
    {
        tableEntity = new TableEntity();
    }

    public void ReadEntity(IDictionary<string, EntityProperty> properties, Microsoft.WindowsAzure.Storage.OperationContext operationContext)
    {
        tableEntity.ReadEntity(properties, operationContext);
    }

    public IDictionary<string, EntityProperty> WriteEntity(Microsoft.WindowsAzure.Storage.OperationContext operationContext)
    {
        return tableEntity.WriteEntity(operationContext);
    }
}

4 个答案:

答案 0 :(得分:3)

存储表中的每个属性都是空白的原因是WriteEntity和ReadEntity使用空白对象来存储和写入数据。

您将对象的序列化委托给'tableEntity',但没有任何属性存在。

建议:您需要在从TableEntity派生的类中实现所有Seri​​alizableTableEntity属性,在SerializableTableEntity实体中包含该类型的变量,并将每个成员的属性get / set从SerializableTableEntity委托给此新对象。 / p>

这有意义吗?

编辑:代码样本按要求提供(尽管你不会喜欢它)

    [DataContract]
public class SerializableTableEntity : ITableEntity
{
    private CustomEntity tableEntity;

    public string ETag { 
    {
        get
        {
            return tableEntity.ETag;
        }
        set
        {
            tableEntity.Etag = value;
        }
    }

    public string PartitionKey
    {
        get
        {
            return tableEntity.PartitionKey;
        }
        set
        {
            tableEntity.PartitionKey = value;
        }
    }

    public string RowKey
    {
        get
        {
            return tableEntity.RowKey;
        }
        set
        {
            tableEntity.RowKey = value;
        }
    }

    public DateTimeOffset Timestamp
    {
        get
        {
            return tableEntity.Timestamp;
        }
        set
        {
            tableEntity.Timestamp = value;
        }
    }

    public string PropertyOne
    {
        get
        {
            return tableEntity.PropertyOne;
        }
        set
        {
            tableEntity.PropertyOne = value;
        }
    }


    public SerializableTableEntity()
    {
        tableEntity = new CustomEntity();
    }

    public void ReadEntity(IDictionary<string, EntityProperty> properties, Microsoft.WindowsAzure.Storage.OperationContext operationContext)
    {
        tableEntity.ReadEntity(properties, operationContext);
    }

    public IDictionary<string, EntityProperty> WriteEntity(Microsoft.WindowsAzure.Storage.OperationContext operationContext)
    {
        return tableEntity.WriteEntity(operationContext);
    }
}

public class CustomEntity : TableEntity
{
    public string PropertyOne { get; set; }
}

答案 1 :(得分:1)

我最终创建了这些类的精确副本,并使它们成为Serializable。但是能够做一些复杂的查询似乎也是一个挑战。所以我们搬到了SQL数据库。

答案 2 :(得分:0)

委托“不感兴趣”的方法(一个更现实的例子是here):

class YourClass : Interface {
    public void ReadEntity()
    {
       delegateTo.ReadEntity();
    }
    TableEntity delegateTo = new TableEntity();
}

或者只是在其中抛​​出一个异常(如NotImplementedException) - 后者只有在没有调用这些方法时才适合你。

答案 3 :(得分:0)

您可以创建一个包含TableEntity类实现的类,但也可以添加所需的功能。这类似于Decorator Pattern

[Attributes...]
public class MyTableEntity : ITableEntity {
  private TableEntity decoratedTableEntity;

  public void ReadEntity(args...) {
    decoratedTableEntity.ReadEntity(args...);
  }

}

要使解决方案更通用,请将decoratedTableEntity更改为ITableEntity。