铸造不同类型的物体

时间:2011-09-20 06:28:53

标签: casting

我写了一个类(下面的代码片段),它有一些数据成员,我从客户端放置数据。我应该通过Web Services发送这些数据,这是一个包含我的数据成员的类,但是我的类有更多的数据成员。

我应该从我的类型转换为另一种类型。

问题在于我不知道如何访问数据成员来从中获取数据。

我的所有数据都进入了这个对象“OBJ”:

__XtraInvoiceInfo OBJ = new __XtraInvoiceInfo();

,Web Services的类型是“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
            };

错误“成员无法访问”表示* - > 'object'不包含'InvoiceDate'的定义,也没有扩展方法'InvoiceDate'接受类型'object'的第一个参数(你是否缺少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 个答案:

答案 0 :(得分:2)

这就是问题所在:

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)的标识符保留供实现使用。例如,实现可能会提供以两个下划线开头的扩展关键字。