【问题标题】:VB.Net stuck with setvalue method of system reflectionVB.Net坚持系统反射的setvalue方法
【发布时间】:2013-06-09 08:27:54
【问题描述】:

非常感谢大家抽出宝贵时间!

我这样做正确吗?它说“参数计数不匹配”。对于SetValue 方法

For i = 0 To (missingFieldName.Count) - 1

Dim propertyiInfo As System.Reflection.PropertyInfo =       
GetType(ImportFields).GetProperty(missingValuesTakenfromUser.missingFieldAcquired(i, 0))

  Dim fieldacquired As String = missingValuesTakenfromUser.missingFieldAcquired(i, 1)

  propertyiInfo.SetValue(fields, fieldacquired, New Object() {0})

Next i

fields 是 ImportFields 类的一个实例。在过去的 2 天内尝试了 100 种不同的方法来解决这个问题。正在拼命寻找解决方案,请问有人吗?

【问题讨论】:

    标签: reflection system setvalue


    【解决方案1】:

    对于非索引属性,第三个参数应该为 null,而不是空数组。试试这个:

    propertyiInfo.SetValue(fields, fieldacquired, null);
    

    如果您使用 .net 4.5,则有一个新的重载,您只能使用两个参数:

    propertyiInfo.SetValue(fields, fieldacquired); // .net 4.5 only
    

    【讨论】:

    • 非常感谢您的回复。我正在访问的属性是一个数组,我需要将新值设置为其第一个元素,即元素 0。对于 i = 0 To (missingFieldName.Count) - 1 Dim propertyiInfo As System.Reflection.PropertyInfo = GetType(ImportFields) .GetProperty("CustomerName") propertyiInfo.SetValue(fields, "New Value" , New Object() {0}) Next i
    • 在这种情况下,您不应该获取属性值(即数组实例),然后设置数组的第一个元素吗?
    • 不知道该怎么做。我想要的是为数组属性的第一个元素赋值。我有我的类 ImportFields 的实例,其中包含名称字段。我在 ImportFields 类中有几个属性,它们是从 ascii 文件设置的。我运行系统反射以找出未从 ascii 文件设置的属性。我需要将该属性设置为我在文本框中从用户那里获取的值。我搜索了很多,发现系统反射有一个方法 setvalue,我认为这应该对我有用。但你认为我错了。请告知我该如何实现这一目标。非常感谢!
    【解决方案2】:

    经过4天的连续奋斗,得到了它。这是怎么做的

    非常感谢 Jods 提供以上提示。

    For i = 0 To (missingFieldName.Count) - 1
    
    Dim propertyiInfo As System.Reflection.PropertyInfo =   
    GetType(ImportFields).GetProperty(missingValuesTakenfromUser.missingFieldAcquired(i, 0))
    
     Dim fieldacquired As String = missingValuesTakenfromUser.missingFieldAcquired(i, 1)
    
     propertyiInfo.GetValue(fields, Nothing)(0) = fieldacquired
    
    Next i
    

    实际上,当他们说索引项目时,MS 有点令人困惑。这对我来说意味着他们指的是数组。

    非常感谢所有努力为我解决这个问题的人。

    【讨论】:

    • 是的,这就是我的意思。很高兴你想出来了。让您感到困惑的 MSDN 部分是指索引属性。这些是带有参数的属性,很像函数。它们与属性的返回类型完全无关。在 C# 中,您只能使用默认的 this[] 索引属性,而 VB.NET 提供了更大的灵活性并且可以定义许多命名的索引属性。在这个问题中可以找到一些示例声明:stackoverflow.com/questions/11711659/c-indexed-properties
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    相关资源
    最近更新 更多