Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将对象设置为自身的实例VB.NET_.net_Vb.net_Oop_Reflection - Fatal编程技术网

将对象设置为自身的实例VB.NET

将对象设置为自身的实例VB.NET,.net,vb.net,oop,reflection,.net,Vb.net,Oop,Reflection,我现在正在使用一个测试对象作为一个非常大的对象(700个左右的属性)的概念证明 基本上,我正在尝试用一个新的构造函数设置对象中的数据,而不必手动设置属性,因为有太多的属性。比如说 Person.Name = "Bob" Person.Age = 30 etc... 相反,我试图做的是通过反射迭代对象中的属性,并设置对象中的属性。数据以巨大的字符串形式从大型机传入 Private _person As Person Public Sub New(ByVal personData As Stri

我现在正在使用一个测试对象作为一个非常大的对象(700个左右的属性)的概念证明

基本上,我正在尝试用一个新的构造函数设置对象中的数据,而不必手动设置属性,因为有太多的属性。比如说

Person.Name = "Bob"
Person.Age = 30
etc...
相反,我试图做的是通过反射迭代对象中的属性,并设置对象中的属性。数据以巨大的字符串形式从大型机传入

Private _person As Person

Public Sub New(ByVal personData As String)
    _person = TryCast(ConvertStringToObject(personData, Me.GetType), Person)
End Sub

Public Property FirstName As String
    Get
        Return _person.FirstName
    End Get
    Set(ByVal value As String)
        _person.FirstName = value
    End Set
End Property

 Private Function ConvertStringToObject(ByVal data As String, ByVal obj As Object) As Object

    Dim objectType As Type = obj.GetType
    Dim properties As PropertyInfo() = objectType.GetProperties

    For Each objProperty As PropertyInfo In properties

        'just an example... not really how i get data...
        Dim value As String = data.Substring(0, 10)

        objProperty.SetValue(obj, value, Nothing)

    Next

    Return obj

End Function
因此,当我运行这段代码时,一旦设置了属性名(first property),我就会得到一个对象引用集错误。。。好像我创造了一个似是而非的东西。。。我试图在它存在之前设置它,但要使它存在,我需要先填充它

我使用的方法必须是通用的,因为它使用的是一堆不同的对象,这就是我返回对象的原因

我过去也做过类似的事情,但在MVC表单的模型中内置了实体框架中的和实体,但在这种情况下,我有两个不同的对象,所以没有问题

目前,我的convertStringToObject方法本身处于禁用状态,我只需调用它并将其转换为我想要的对象,但我真的希望将其放在基类中,让另一个对象继承它并使用新的构造函数。所以代码看起来像:

dim person as new Person 
person = TryCast(ConvertStringToObject(dataString,person), Person)
同样地,代码不是很多,但是仍然希望通过新的构造函数在类内部进行转换

任何想法都将不胜感激


谢谢。

您已经有了一个可用的变量,
Me
,而不需要私有变量来保存当前对象实例。以下是调整后的代码,它使用
Me
作为设置其属性值的目标:

Public Sub New(ByVal personData As String)
    ConvertStringToObject(personData)
End Sub

Public Property FirstName As String

 Private Sub ConvertStringToObject(ByVal data As String)

    Dim objectType As Type = Me.GetType
    Dim properties As PropertyInfo() = objectType.GetProperties

    For Each objProperty As PropertyInfo In properties

        'just an example... not really how i get data...
        Dim value As String = data.Substring(0, 10)

        objProperty.SetValue(Me, value, Nothing)

    Next
End Function

希望对您有所帮助。

在这种情况下,当构建对象是一项复杂或耗时的任务时,我们可以采用factory模式或builder模式。对于您想要完成的任务,构建器模式是完美的匹配。peson类承载了大量数据(对于这700个属性)。因此,我们还需要将数据传输与业务模型验证分离。以下是如何做到这一点:

首先,将数据模型和验证解耦 然后定义实例化过程 构建具体实例的一种方法是使用大型机中的looong字符串

class MainFramePersonBuilder
    inherits PesonBuilder

    overrides function BuildPerson as Person
         dim pData as PersonData
         pData = DeserializeMainFrameString(_stringRepresentation)
         return new Person(pData)
    end sub

    private function DeserializeMainframeString(mString as string) as personData
         ... do the reflection stuff here...
         ... dont use person class direcctly...
         ... rather use the PersonData structure...

         return thePersonData
    end sub
另一种方法是使用从某个web服务获取的数据执行此操作 我知道它不在范围之内,但如果需要的话,这个架构将有所帮助

 class JSONPersonBuilder
    inherits PersonBuilder

    overrides function BuildPerson as person
        return new Person(DeserializeJSONString(_stringRepresentation))
    end function

  end class
所以在你的代码中你可以写
现在,如果您需要通过网络或您自己的Web服务将
人员
传输到其他地方,则不需要发送主框架字符串。序列化PersonData并发送它。您将把客户机与服务器隔离开来—您的PersonData是中间层。

我始终怀疑在构造函数中调用复杂的方法。如果该方法抛出异常怎么办?有了反思,这种可能性很高。然后我们有一个未完成的Person实例,它处于不一致的状态。构造函数中调用的方法可能将对象引用泄漏到其他对象(缓存等),这样不一致的对象甚至不会被垃圾收集。这也是一种很好的方法。让一个单独的组件执行复杂对象的构造可以更容易地以新的对象创建方式进行交换。嗯,在me中交换而不是私有变量仍然会导致对象引用未设置错误…好的,所以在这个例子中,我复制person类,PersonData类填充其中一个并将其设置为另一个?我试过了代码,它是有效的,但我有点担心的开销。这是一个有趣的方法!编辑了我的文章,以包含当前如何使用ConvertStringToObject方法。当然会有开销,但随着抽象程度的提高,熵确实会增加。这是一个经典的权衡赌注。性能和可维护性。我们正在讨论的代码部分构成了业务层,并且经常更改。因此,事情需要高度解耦。这段代码很快将通过web服务、sdk库、web界面、桌面界面等同时公开。之后发生的事情是,一个家伙走过来,要求你将
此人
与他的facebook个人资料集成。让主机见鬼去吧。顺便说一句,谷歌搜索一下你提到的其他模式。谢谢你的建议!
class MainFramePersonBuilder
    inherits PesonBuilder

    overrides function BuildPerson as Person
         dim pData as PersonData
         pData = DeserializeMainFrameString(_stringRepresentation)
         return new Person(pData)
    end sub

    private function DeserializeMainframeString(mString as string) as personData
         ... do the reflection stuff here...
         ... dont use person class direcctly...
         ... rather use the PersonData structure...

         return thePersonData
    end sub
 class JSONPersonBuilder
    inherits PersonBuilder

    overrides function BuildPerson as person
        return new Person(DeserializeJSONString(_stringRepresentation))
    end function

  end class
 dim pb as PersonBuilder = new MainFramePersonBuilder() 'JSONPersonBuilder
 pb.setString(mainFrameString) ' JSONString
 dim p as Person = pb.BuildPerson()