Передача IList <T>против IEnumerable <T>с protobuf-net - PullRequest
3 голосов
/ 07 августа 2009

В журнале изменений protobuf-net я заметил, что IList <> поддерживается, но я получаю исключение «Невозможно создать экземпляр интерфейса». Если я перейду на IEnumerable <>, тогда жизнь будет хорошей. Это звучит правильно?

    // Client call
    public override IList<IApplicationWorkflow> Execute(IRoleManagement service)
    {
        IList<ApplicationWorkflowMessagePart> list = service.RetrieveWorkflows(roleNames);

        IList<IApplicationWorkflow> workflows = new List<IApplicationWorkflow>(list.Count);

        foreach (ApplicationWorkflowMessagePart a in list)
        {
            workflows.Add(new ApplicationWorkflowImpl(a));
        }

        return workflows;
    }


    // Service contract
    [OperationContract, ProtoBehavior]
    [ServiceKnownType(typeof (ServiceFault))]
    [FaultContract(typeof (ServiceFault))]
    IList<ApplicationWorkflowMessagePart> RetrieveWorkflows(string[] roleNames);


    // Service implementation
    public IList<ApplicationWorkflowMessagePart> RetrieveWorkflows(string[] roleNames)
    {
        IList<IApplicationWorkflow> workflows = manager.RetrieveApplicationWorkflows(roleNames);
        IList<ApplicationWorkflowMessagePart> workflowParts = new List<ApplicationWorkflowMessagePart>();
        if (workflows != null)
        {
            foreach (IApplicationWorkflow workflow in workflows)
            {
                workflowParts.Add(
                    ModelMediator.GetMessagePart<ApplicationWorkflowMessagePart, IApplicationWorkflow>(workflow));
            }
        }
        return workflowParts;
    }

Спасибо, Mike

Кроме того, есть ли на сайте документов этот и другие ответы? Я ненавижу задавать новые вопросы. :)

1 Ответ

2 голосов
/ 07 августа 2009

В настоящее время он будет поддерживать IList<T> как свойство , если ему не нужно его создавать - т.е. разрешать такие вещи, как (атрибуты не показаны для краткости):

class Order {
    private IList<OrderLine> lines = new List<OrderLine>();
    public IList<OrderLine> Lines {get {return lines;}}
}

Я должен был бы проверить, но по тем же причинам, я ожидаю, что он будет работать с Merge, но не Deserialize (это то, что используют перехватчики WCF). Тем не менее, я не могу придумать причину, по которой он не может установить значение по умолчанию List<T> ... на данный момент это не так.

Самый простой вариант - это, вероятно, придерживаться List<T> / T[] - но я могу взглянуть, если хотите ... но я сейчас нахожусь в "затруднительном положении" над (рабочим) проектом, поэтому я не могу поднять капот сегодня.


Ре "этот и другие ответы" ... существует группа google , но это не просто protobuf-net (protobuf-net - просто одна из многих реализаций "буферов протокола").

Вы также можете зарегистрировать проблему на сайте проекта . Я хочу сопоставить часто задаваемые вопросы и добавить их в вики на сайте - но время не всегда мой друг ...

Но эй! Я здесь ...; -p

...