在运行时从数据添加方法/属性?

时间:2018-01-08 17:54:37

标签: .net vb.net

我们的一位客户问我们是否可以在其中一个课程中添加另一个字段。该字段实际上只对它们有用,显然,我们宁愿不为它们设置自定义版本。

这个问题的显而易见的解决方案是让我们的基类有一个名为Dictionary的{​​{1}},并将我们想要的任何东西放在那里。但是存在一个问题 - 客户使用(主要)使用Extras来访问我们的对象。

我知道我可以为.net类添加新方法和属性,但有没有办法在运行时从数据执行此操作?例如,如果特定对象的public property X有一个名为“SomeField”的条目,我可以在运行时添加一个名为Extras的新属性吗?

2 个答案:

答案 0 :(得分:0)

我能想出几种解决问题的方法;没有涉及在运行时添加属性,这是不可能的。

<强> 1。明确的界面实施

听起来你没有为你的课程提供公共界面(你应该)。如果这样做,您可以编译一次类,并指示不同的客户使用不同的接口。

Public Interface IClass
    Property X As String
End Interface

Public Interface ICustomer1
    Inherits IClass
    Property Y As String
End Interface

Public Class A
    Implements IClass, ICustomer1

    Public Property X As String Implements IClass.X

    Public Property Y As String Implements ICustomer1.Y

End Class

Module MyApplication

    Sub Main()
        Dim c As IClass = New A()
        Dim c1 As ICustomer1 = New A()
        c.X = "x"
        c.Y = "y" ' compile error, 'Y' is not a member of 'IClass'.
        c1.X = "x"
        c1.Y = "y"
    End Sub

End Module

技术上允许所有客户使用ICustomer1,因为它是一个公共接口。注意:此处仍然可以使用Dim c = New A(),因此您可能还需要提供一个工厂,将A的实例创建为特定接口。

<强> 2。将属性的EditorBrowsable属性设置为从不

这是偷偷摸摸的,因为它会将客户Y隐藏起来,但它仍然可以访问。这使它有点不方便,因为它不会出现在intellisense中。但是你可以让你的客户知道它存在并且他们将能够使用它。注意:只有在引用dll时它才变为不可浏览 - 而不是在Visual Studio中的另一个项目中引用它时

Public Class A
    Public Property X As String

    <EditorBrowsable(EditorBrowsableState.Never)>
    Public Property Y As String

End Class

我希望其中一个可以提供帮助。

答案 1 :(得分:0)

您可以使用简单的a.astype(str).groupby(a.number, as_index=False).agg('; '.join) A number 0 abc; def 2; 2 1 ghi 3

Property

如果您想要智能感知,则需要向客户提供选项列表。您可以向您的客户发送共享课程:

Class MyObject
  Public Property Extras(customFieldName As String) As String
    Get
      'return custom field value here based on customfieldname (e.g. sql query)        
    End Get
    Set(value As String)
      'set custom field value here based on customfieldname (e.g. sql insert)        
    End Set
  End Property
End Class

然后您的客户按如下方式使用它:

Public NotInheritable Class ExtraFields
  Public Shared Property MyExtraFieldName1 As String = "MyExtraFieldName1"
  Public Shared Property MyExtraFieldName2 As String = "MyExtraFieldName2"

  Private Sub New()
    'private constructor to prevent instantiation
  End Sub
End Class

您的基本代码只会将自定义字段名称视为Dim o As New MyObject Dim s As String = o.Extras(ExtraFields.MyExtraFieldName1) ,因此您可以为所有客户使用相同的代码。每个客户都有一个个性化的String类,其中包含特定的自定义字段名。

如果允许客户创建新的字段名称,那么他们只需将它们作为ExtraFields值传递给该属性,并由他们拼写正确:

String