4

我正在尝试实现ITableEntity接口,以便可以[DataContract]在其上添加属性。但是如果我自己实现这个接口,我将不得不给ReadEntityandWriteEntity方法一个主体。

但是有一个类已经实现了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

4 回答 4

3

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

您将对象的序列化委派给“tableEntity”,但您的任何属性都不存在。

建议:您需要在派生自 TableEntity 的类中实现所有 SerializableTableEntity 的属性,在 SerializableTableEntity 实体中包含该类型的变量,并将每个成员的属性从 SerializableTableEntity 获取/设置委托给这个新对象。

这有意义吗?

编辑:按要求提供代码示例(尽管您不会喜欢它)

    [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; }
}
于 2013-08-28T15:52:51.573 回答
1

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

于 2013-09-11T08:35:54.530 回答
0

要么委托“无趣”的方法(一个更现实的例子是here):

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

或者只是在它们内部抛出一个异常(比如NotImplementedException)——后者只有在没有调用这些方法时才对你有用。

于 2013-08-28T12:35:12.030 回答
0

您可以创建一个包含 TableEntity 类的实现的类,还可以添加您想要的功能。这类似于装饰者模式

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

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

}

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

于 2013-08-28T12:35:59.417 回答