4

我需要找到以下代码的等效项以在可移植库中使用:

    Public Overridable Function GetPropertyValue(ByVal p_propertyName As String) As Object
        Dim bf As System.Reflection.BindingFlags
        bf = Reflection.BindingFlags.IgnoreCase Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic
        Dim propInfo As System.Reflection.PropertyInfo = Me.GetType().GetProperty(p_propertyName, bf)
        Dim tempValue As Object = Nothing

        If propInfo Is Nothing Then
            Return Nothing
        End If

        Try
            tempValue = propInfo.GetValue(Me, Nothing)

        Catch ex As Exception
            Errors.Add(New Warp10.Framework.BaseObjects.BaseErrorMessage(String.Format("Could not Get Value from Property {0}, Error was :{1}", p_propertyName, ex.Message), -1))
            Return Nothing
        End Try

        Return tempValue

    End Function

BindingFlags 似乎不存在。System.Reflection.PropertyInfo 是有效类型,但我不知道如何填充它。有什么建议么?

4

1 回答 1

7

对于 Windows 8/Windows Phone 8,许多反射功能已移至新的 TypeInfo 类。您可以在此 MSDN 文档中找到更多信息。对于包括运行时属性(例如,包括那些继承的属性)在内的信息,您也可以使用新的RuntimeReflectionExtensions 类(其中过滤可以简单地通过 LINQ 完成)。

虽然这是 C# 代码(我很抱歉 :)),但使用这个新功能是相当等价的:

public class TestClass
{
    public string Name { get; set; }

    public object GetPropValue(string propertyName)
    {
        var propInfo = RuntimeReflectionExtensions.GetRuntimeProperties(this.GetType()).Where(pi => pi.Name == propertyName).First();
        return propInfo.GetValue(this);
    }
}

如果您只关心在类本身上声明的属性,则此代码会更简单:

public class TestClass
{
    public string Name { get; set; }

    public object GetPropValue(string propertyName)
    {
        var propInfo = this.GetType().GetTypeInfo().GetDeclaredProperty(propertyName);
        return propInfo.GetValue(this);
    }
}
于 2012-12-06T00:47:52.880 回答