不能通过反射在uwp中检索依赖属性

本文关键字:检索 依赖 属性 uwp 反射 不能 | 更新日期: 2023-09-27 18:07:21

我想获得一个控件的所有依赖属性。我试过这样写:

static IEnumerable<FieldInfo> GetDependencyProperties(this Type type)
{
    var dependencyProperties = type.GetFields(BindingFlags.Static | BindingFlags.Public)
                                   .Where(p => p.FieldType.Equals(typeof(DependencyProperty)));
            return dependencyProperties;
}
public static IEnumerable<BindingExpression> GetBindingExpressions(this FrameworkElement element)
{
    IEnumerable<FieldInfo> infos = element.GetType().GetDependencyProperties();
    foreach (FieldInfo field in infos)
    {
        if (field.FieldType == typeof(DependencyProperty))
        {
            DependencyProperty dp = (DependencyProperty)field.GetValue(null);
            BindingExpression ex = element.GetBindingExpression(dp);
            if (ex != null)
            {
                yield return ex;
                System.Diagnostics.Debug.WriteLine("Binding found with path: “ +ex.ParentBinding.Path.Path");
            }
        }
    }
}

也是一个类似的stackoverflow问题。GetFields方法总是返回一个空枚举。

[EDIT]我在通用windows平台项目

中执行了以下几行
typeof(CheckBox).GetFields()    {System.Reflection.FieldInfo[0]}
typeof(CheckBox).GetProperties()    {System.Reflection.PropertyInfo[98]}
typeof(CheckBox).GetMembers()   {System.Reflection.MemberInfo[447]}

似乎是一个bug?

不能通过反射在uwp中检索依赖属性

在UWP中,静态DependencyProperty成员似乎被定义为公共静态属性,而不是公共静态字段。例如SelectionModeProperty属性,它被声明为

public static DependencyProperty SelectionModeProperty { get; }

所以当表达式

typeof(ListBox).GetFields(BindingFlags.Static | BindingFlags.Public)
    .Where(f => typeof(DependencyProperty).IsAssignableFrom(f.FieldType))

返回一个空IEnumerable,表达式

typeof(ListBox).GetProperties(BindingFlags.Public | BindingFlags.Static)
    .Where(p => typeof(DependencyProperty).IsAssignableFrom(p.PropertyType))

返回一个包含一个元素的IEnumerable,即上面提到的SelectionModeProperty。

请注意,您还必须调查所有基类以获得DependencyProperty字段/属性的完整列表。