.net - 动态生成的泛型类型无法正常工作
问题描述
以下代码可以正常工作:
Dim SubmodelElement = New BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.[Property](Of Double)() With {
.IdShort = "TestProperty1",
.[Set] = Function(prop, val)
Return _test = val
End Function
}
SubmodelElement.[Get] = Function(prop)
Return 4711
End Function
我要做的是使用以下代码为我的类的每个属性动态创建这些子模型元素:
For Each Eigenschaft As PropertyInfo In Me.GetType().GetProperties()
If Eigenschaft.CanRead = True Then
Dim Eigenschaftstyp As Type = Type.GetType(Eigenschaft.PropertyType.FullName)
Dim GenerischerTypBasysProperty As Type = GetType(BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.Property(Of)).MakeGenericType(Eigenschaftstyp)
Dim BasysEigenschaft = Activator.CreateInstance(GenerischerTypBasysProperty)
BasysEigenschaft.IdShort = Eigenschaft.Name
BasysEigenschaft.[Get] = Function(prop)
'Return Eigenschaft.GetValue(Me)
Return 4711
End Function
BasysEigenschaft.Set = Sub(ByVal Prop, ByVal Wert)
Eigenschaft.SetValue(Me, Wert)
End Sub
MyBase.SubmodelElements.Add(BasysEigenschaft)
End If
Next
正如在调试器中看到的那样,两个对象(SubmodelElement 和 BasysEigenschaft 属于同一类型)。
submodelElement 和 BasysEigenschaft 的值的屏幕截图
不幸的是,[Get] 函数的分配在第二个代码片段中不起作用。我收到这个错误
System.InvalidCastException:“方法调用失败,因为 'Public Overrides Property Get() As BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes.GetPropertyValueHandler(Of Double)' 无法使用这些参数调用:参数匹配参数 'value' 无法转换从 'VB$AnonymousDelegate_0(Of Object,Integer)' 到 'GetPropertyValueHandler(Of Double)'。
任何帮助将不胜感激
解决方案
我与 SubmodelElementTypes.Property -Class 的创建者讨论了这个问题。像 Craig 建议的 Activator.CreateInstance-method 不会创建与 new Property (of T) 构造函数完全相同的类型。以下几行解决了这些问题。
For Each Eigenschaft As PropertyInfo In Me.GetType().GetProperties()
If Eigenschaft.GetCustomAttributes(Of BasysPropertyAttribute).Count > 0 Then
If Eigenschaft.CanRead = True Then
If Eigenschaft.CanRead = True Then
Dim Eigenschaftstyp As Type = Type.GetType(Eigenschaft.PropertyType.FullName)
Dim BasysDataTypeXsd As DataType = DataType.GetDataTypeFromSystemType(Eigenschaftstyp)
Dim BasysEigenschaft As BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.Property = DirectCast(SubmodelElementFactory.CreateSubmodelElement(ModelType.Property, BasysDataTypeXsd), BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.Property)
BasysEigenschaft.IdShort = Eigenschaft.Name
BasysEigenschaft.[Get] = Function(BasysProperty As Object)
Return New ElementValue(Eigenschaft.GetValue(Me), BasysDataTypeXsd)
End Function
BasysEigenschaft.[Set] = Sub(ByVal BasysProperty As Object, ByVal Wert As ElementValue)
Eigenschaft.SetValue(Me, CTypeDynamic(TypeDescriptor.GetConverter(Eigenschaftstyp).ConvertFromString(Nothing, Globalization.CultureInfo.InvariantCulture, Wert.Value), Type.GetType(Eigenschaft.PropertyType.FullName)))
End Sub
MyBase.SubmodelElements.Add(BasysEigenschaft)
End If
End If
End If
Next
感谢克雷格的帮助!
推荐阅读
- python-3.x - 如何使用 python 获取单个 MACRO-VBA 文件中存在的多个按钮的名称?
- python - 连续字符后的意外字符(我是初学者请帮助)
- python - Heroku CLI 登录失败并出现错误“错误:ENOENT:没有这样的文件或目录,打开 'H:/_netrc'”
- python - Django 无效的 http_host
- powershell - 使用 PowerShell Ping 服务器
- batch-file - 批处理脚本 - 在目录中的每个文件上运行程序
- ssl - 8443端口有什么用?
- javascript - 有没有办法使用 Sequelize 模型方法来表达以下 SQL 查询?
- c# - 在控制台中镜像文件内容
- python-3.x - Python 产生 kysl� 而不是 kyslá