Литые предметы разного типа - PullRequest
1 голос
/ 20 сентября 2011

Я написал класс (фрагмент ниже), в котором есть некоторые элементы данных, в которые я помещаю данные со стороны клиента. Я должен отправить эти данные через веб-сервисы, где есть класс, который включает в себя мои элементы данных, но содержит больше элементов данных, чем мой класс.

Я должен привести из своего типа в другой тип.

Проблема в том, что я не знаю, как получить доступ к членам данных для получения данных.

все мои данные находятся в этом объекте "OBJ":

__XtraInvoiceInfo OBJ = new __XtraInvoiceInfo();

и тип веб-служб: "InvoiceWithEntriesInfo"

var convertedObj = new InvoiceWithEntriesInfo()
            {
                invoiceNumber = OBJ.BasicInfo.InvoiceNumber --> member is not access.
                                           |  Equals
                    Visual Studio suggests |  GetHashCode
                    only these methods     |  GetType
                                           |  ToString

                invoiceDate = OBJ.BasicInfo.InvoiceDate *--> member is not accessible
                firstName = OBJ.Payer.FirstName *-->> not accessible
                lastName =  OBJ.Payer.LastName *-->> not accessible                      
                catem = OBJ.Payer.Catem *-->> not accessible
            };

ошибка " член недоступен " означает * -> 'объект' не содержит определения для 'InvoiceDate' и нет метода расширения 'InvoiceDate', принимающего первый аргумент типа ' объект 'может быть найден (вам не хватает директивы using или ссылки на сборку?)

 public sealed class __XtraInvoiceInfo
{
    private long _payerType = -1;

    public long PayerType
    {
        get
        {
            return this._payerType;
        }
        set
        {
            this._payerType = value;

            if (value == Constants.NATURAL_PAYER)
            {
                this.Payer = new __NaturalInvoiceInfo();
            }                
        }
    }

    public object Payer
    {
        get; set;
    }

    public object BasicInfo
    {
        get; set;
    }


    //-- Nested Types --
    public sealed class __NaturalInvoiceInfo
    {          
        public string FirstName
        {
            get; set;
        }

        public string LastName
        {
            get; set;
        }

        public long Catem
        {
            get; set;
        }
    }

    public sealed class __BasicInvoiceInfo
    {
        public long InvoiceNumber
        {
            get; set;
        }

        public DateTime? InvoiceDate
        {
            get; set;
        }
    }

}

Я сделал свойства Payer и BasicInfo, потому что через них я беру данные от Клиента и делаю суббиндинг на своих участников следующим образом:

model.BindModel(xii =>
            {
                var bindModel = new ValidationFrameBindModel<__XtraInvoiceInfo.__BasicInvoiceInfo>();

                this.BindControls(bindModel);

                model.BindModel<__XtraInvoiceInfo.__BasicInvoiceInfo>((x,b) => x.BasicInfo = b, bindModel);
            });

Спасибо большое !!! если у вас есть возможность ответить на мой вопрос. Я готов сказать больше деталей, если это потребуется.

1 Ответ

2 голосов
/ 20 сентября 2011

Ну, вот в чем проблема:

public object Payer { get; set; }
public object BasicInfo { get; set; }

Вы объявляете свойства только как имеющие тип object - почему бы не дать им более полезные типы?Если вы не знаете типы, как вы узнаете, какие свойства будут там?Можете ли вы создать абстрактный базовый класс или интерфейс, в котором будут описаны все свойства, которые вы хотите гарантировать?(Если честно, довольно сложно сказать, что вы пытаетесь сделать.)

Если вы используете C # 4 и .NET 4, вы могли бы просто сделать их динамичными:

public dynamic Payer { get; set; }
public dynamic BasicInfo { get; set; }

Тогда доступ к под-свойствам будет привязан во время выполнения к фактическому типу объекта.

В примечании, пожалуйста, не добавляйте префиксы имен к __ -спецификация C # резервирует идентификаторы, использующие __ для специфичных для компилятора функций.Из раздела 2.4.2:

Идентификаторы, содержащие два последовательных символа подчеркивания (U + 005F), зарезервированы для использования реализацией.Например, реализация может предоставлять расширенные ключевые слова, которые начинаются с двух подчеркиваний.

...