在metro应用中使用反射的静态字段

时间:2014-05-26 10:32:25

标签: c# windows-runtime microsoft-metro system.reflection

我正在尝试将静态字段信息添加到metro应用程序中,但我找不到这样做的方法。

我试过了: - type.GetRuntimeField - 在循环中输入typeInfo.GetDeclaredField以深入研究每个父类型

        /// <summary>
        /// Gets the field info from the specified name
        /// </summary>
        /// <param name="type">The source type</param>
        /// <param name="fieldName">The name of the field</param>
        /// <returns>The field info if found, null otherwise</returns>
        public static FieldInfo GetField(this Type type, string fieldName)
        {
            var currentType = type;
            FieldInfo result = null;
            while (result == null && currentType != null)
            {
                var typeInfo = currentType.GetTypeInfo();
                result = typeInfo.GetDeclaredField(fieldName);
                currentType = typeInfo.BaseType;
            }

            return result;
        }

...我是否遗漏了某些内容,或者无论如何在Metro应用中使用反射获取静态字段?....

修改: 好吧,我很抱歉那些浪费时间在这个问题上的人,框架中定义的依赖属性实际上不是只读静态字段,它们是静态属性......因为我通常将我的dps声明为字段,所以我没有&#39;考虑形式示例FrameworkElement.Width可以是属性的事实......

所以这是我用来获取字段和属性信息的代码:

public static class TypeExtensions
{
    /// <summary>
    /// Gets the field info from the specified name
    /// </summary>
    /// <param name="type">The source type</param>
    /// <param name="fieldName">The name of the field</param>
    /// <returns>The field info if found, null otherwise</returns>
    public static FieldInfo GetField(this Type type, string fieldName)
    {
        var currentType = type;
        FieldInfo result = null;
        while (result == null && currentType != null)
        {
            var typeInfo = currentType.GetTypeInfo();
            result = typeInfo.GetDeclaredField(fieldName);
            currentType = typeInfo.BaseType;
        }

        return result;
    }

    /// <summary>
    /// Gets the property info from the specified name
    /// </summary>
    /// <param name="type">The source type</param>
    /// <param name="propertyName">The name of the property</param>
    /// <returns>The field info if found, null otherwise</returns>
    public static PropertyInfo GetProperty(this Type type, string propertyName)
    {
        var currentType = type;
        PropertyInfo result = null;
        while (result == null && currentType != null)
        {
            var typeInfo = currentType.GetTypeInfo();
            result = typeInfo.GetDeclaredProperty(propertyName);
            currentType = typeInfo.BaseType;
        }

        return result;
    }
}

public static class DependencyObjectExtensions
{
    public static DependencyProperty GetDependencyProperty(this DependencyObject dependencyObject, string propertyName)
    {
        var dependencyPropertyName = propertyName + "Property";
        var type = dependencyObject.GetType();
        var fieldInfo = type.GetField(dependencyPropertyName);
        if (fieldInfo == null)
        {
            var propertyInfo = type.GetProperty(dependencyPropertyName);
            if (propertyInfo != null)
            {
                return propertyInfo.GetValue(dependencyObject) as DependencyProperty;
            }
        }
        else
        {
            var value = fieldInfo.GetValue(dependencyObject);
            return value as DependencyProperty;
        }

        return null;
    }
}

非常感谢

此致 查尔斯

0 个答案:

没有答案