生成DLL的代码如下:
public class QtObject : DependencyObject
{
public int speedSimu
{
get { return (int)GetValue(speedSimuProperty); }
set { SetValue(speedSimuProperty, value); }
}
public static readonly DependencyProperty speedSimuProperty =
DependencyProperty.Register("speedSimu", typeof(int), typeof(QtObject), new PropertyMetadata(0));
public int rpmSimu
{
get { return (int)GetValue(rpmSimuProperty); }
set { SetValue(rpmSimuProperty, value); }
}
public static readonly DependencyProperty rpmSimuProperty =
DependencyProperty.Register("rpmSimu", typeof(int), typeof(QtObject), new PropertyMetadata(0));
public int nbSimu;
}
public class Timer : DependencyObject
{
public string description
{
get { return (string)GetValue(descriptionProperty); }
set { SetValue(descriptionProperty, value); }
}
public static readonly DependencyProperty descriptionProperty =
DependencyProperty.Register("description", typeof(string), typeof(Timer), new PropertyMetadata("This is a time"));
public bool isActive
{
get { return (bool)GetValue(isActiveProperty); }
set { SetValue(isActiveProperty, value); }
}
public static readonly DependencyProperty isActiveProperty =
DependencyProperty.Register("isActive", typeof(bool), typeof(Timer), new PropertyMetadata(true));
}
public class AnotherClass
{
//blaaa
}
我现在只想得到DependencyObject/Properties。(即没有属性"nbSimu"和对象"AnotherClass")
下面是我的代码:
var library = Assembly.LoadFrom(libraryPath);
IEnumerable<Type> types = library.GetTypes();
var libs = types.Where(t => true);
foreach (Type type in libs)
{
foreach (PropertyInfo property in type.GetProperties())
{
//TODO
}
}
第三行我试了:
var libs = types.Where(t => t.BaseType == typeof(DependencyObject));
它不显示任何错误,但不过滤任何内容…
关于过滤DependencyProperties,我只是不知道该怎么做…
提前感谢你对这两个问题的帮助。
它在我的电脑上运行。
public class A : DependencyObject
{
public string Name { get; set; }
public int speedSimu
{
get { return (int)GetValue(speedSimuProperty); }
set { SetValue(speedSimuProperty, value); }
}
public static readonly DependencyProperty speedSimuProperty =
DependencyProperty.Register("speedSimu", typeof(int), typeof(A), new PropertyMetadata(0));
public int rpmSimu
{
get { return (int)GetValue(rpmSimuProperty); }
set { SetValue(rpmSimuProperty, value); }
}
public static readonly DependencyProperty rpmSimuProperty =
DependencyProperty.Register("rpmSimu", typeof(int), typeof(A), new PropertyMetadata(0));
}
public class B : A
{
public int Age { get; set; }
}
private static void Main(string[] args)
{
var assembly = Assembly.GetExecutingAssembly();
var types = assembly.GetTypes();
var filterTypes = types.Where(t => typeof (DependencyObject).IsAssignableFrom(t)).ToList(); // A and B
Func<string, string> mapFieldToProperty =
field => field.EndsWith("Property") ? field.Remove(field.IndexOf("Property")) : field;
foreach (var type in filterTypes)
{
var depFields =
type.GetFields(BindingFlags.Public | BindingFlags.Static).Where(
f => typeof (DependencyProperty).IsAssignableFrom(f.FieldType)).ToList(); // speedSimuProperty and rpmSimuProperty
var depPropertyNames = depFields.ToLookup(f => mapFieldToProperty(f.Name));
var depProperties =
type.GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(
prop => depPropertyNames.Contains(prop.Name)).ToList(); // speedSimu and rpmSimu
foreach (var property in depProperties)
{
// TODO
}
}
return;
}
第二个问题是什么?您应该保持您的属性/字段的命名约定
var libs = types.Where(t => t.IsSubclassOf(typeof(DependencyObject)));
。