Vb.net 选项严格适用于泛型类型为';直到运行时才知道

Vb.net 选项严格适用于泛型类型为';直到运行时才知道,vb.net,type-parameter,option-strict,Vb.net,Type Parameter,Option Strict,我有以下几个月运行良好的代码,但是我忘记了使用选项创建这个类,所以现在我要回去正确地清理代码,但是我还没有找到解决以下问题的方法 我有一个局部变量声明如下: Private _manageComplexProperties 现在使用option strict,这是不允许的,因为我理解noAs子句,但是这样做的原因是,将分配给它的类的实例使用了一个直到运行时才知道的类型参数。这可通过以下代码解决: Private _type As Type *SNIP OTHER IRRELEVANT VARI

我有以下几个月运行良好的代码,但是我忘记了使用
选项创建这个类,所以现在我要回去正确地清理代码,但是我还没有找到解决以下问题的方法

我有一个局部变量声明如下:

Private _manageComplexProperties
现在使用option strict,这是不允许的,因为我理解no
As
子句,但是这样做的原因是,将分配给它的类的实例使用了一个直到运行时才知道的类型参数。这可通过以下代码解决:

Private _type As Type
*SNIP OTHER IRRELEVANT VARIABLES*

Public Sub Show()

    Dim requiredType As Type = _
        GetType(ManageComplexProperties(Of )).MakeGenericType(_type)

    _manageComplexProperties = Activator.CreateInstance(requiredType, _
         New Object() {_value, _valueIsList, _parentObject, _unitOfWork})

    _result = _manageComplexProperties.ShowDialog(_parentForm)
    If _result = DialogResult.OK Then
        _resultValue = _manageComplexProperties.GetResult()
    End If

End Sub

由于后期绑定,option strict再次抛出了一些错误,但一旦我成功地正确声明了
\u manageComplexProperties
变量,就应该通过强制转换来清除这些错误,但由于直到运行时才知道类型参数,所以我似乎无法获得有效的解决方案。任何帮助都将不胜感激。

您必须在vb文件顶部使用
选项推断。它启用本地
类型推断

使用此选项可以使用
Dim
而不使用“As”子句,就像 C#中的
var

选项推断和选项严格关闭时的智能感知

启用“推断”选项时的IntelliSense(如您所见,它具有类型推断)


如果不想使用option infer on,则必须声明与Activator.CreateInstance返回的变量类型相匹配的变量。您必须在vb文件顶部使用option infer on。它启用本地
类型推断

使用此选项可以使用
Dim
而不使用“As”子句,就像 C#中的
var

选项推断和选项严格关闭时的智能感知

启用“推断”选项时的IntelliSense(如您所见,它具有类型推断)


如果不想使用option Inferre on,则必须声明与Activator.CreateInstance返回的变量类型相匹配的变量

将变量声明为
对象

Private _manageComplexProperties as Object
然后您必须坚持使用反射,例如调用
ShowDialog
方法:

Dim method As System.Reflection.MethodInfo = _type.GetMethod("ShowDialog")
_result = method.Invoke(_manageComplexProperties, New Object() {_parentForm})

将变量声明为
对象

Private _manageComplexProperties as Object
然后您必须坚持使用反射,例如调用
ShowDialog
方法:

Dim method As System.Reflection.MethodInfo = _type.GetMethod("ShowDialog")
_result = method.Invoke(_manageComplexProperties, New Object() {_parentForm})

我认为这对我不起作用,或者我误解了一些完全可能的事情!实际上,我需要像这样声明变量:
Private\u manageComplexProperties=managecomplexproperty(Of)
,但是声明中需要一个类型,我当时不知道。我认为这对我不起作用,或者我误解了一些完全可能的事情!实际上,我需要这样声明变量:
Private\u manageComplexProperties=manageComplexProperties(Of)
,但是它需要声明中的一个类型,我当时不知道。如果这样做,我仍然无法在
Show()中强制转换
\u manageComplexProperties
变量
方法,以便我可以使用
.ShowDialog()
.GetResult()
方法。我开始认为,在这种情况下,您不能对
使用严格的
选项!您不能使用DirectCast(\u manageComplexProperties,YourType)
?好啊你不能。等一下……恐怕你需要使用反射直到结束。请参阅我的编辑以获取一个示例。通过对属性而不是方法进行一些额外的工作,获得正确的重载和强制转换,我的代码现在可以像以前一样工作了,非常感谢!如果这样做,我仍然无法将
Show()
方法中的
\u managecomplexproperty
变量强制转换为任何内容,以便我可以使用
.ShowDialog()
.GetResult()
方法。我开始认为,在这种情况下,您不能对使用严格的
选项!您不能使用DirectCast(\u manageComplexProperties,YourType)
?好啊你不能。等一下……恐怕你需要使用反射直到结束。请参阅我的编辑以获取一个示例。通过对属性而不是方法进行一些额外的工作,获得正确的重载和强制转换,我的代码现在可以像以前一样工作了,非常感谢!