DLL /アセンブリからのDependencyObjectとDependencyPropertiesのフィルタ?

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 types = library.GetTypes();
var libs = types.Where(t => true);

foreach (Type type in libs)
{
    foreach (PropertyInfo property in type.GetProperties())
    {
        //TODO
   }
}

3行目で私は試しました:

var libs = types.Where(t => t.BaseType == typeof(DependencyObject));

それはどんなエラーも言いませんが、何もフィルタリングしません...

DependencyPropertiesをフィルタリングすることについて、私はちょうどそれを行う方法についてのアイデアを持っていません...

両方の問題について、それについての助けを事前に感謝します。

1

2 答え

var libs = types.Where(t => t.IsSubclassOf(typeof(DependencyObject))); should work.

0
追加された
@GuillaumeCogranne:これでうまくいくはずです。私はサンプルを修正しました。最初は間違ったヒントを残して申し訳ありません。
追加された 著者 Fischermaen,
それが問題だ。 WPFの多くのobectはDependencyObjectのサブクラスです。だから、このようにフィルタリングするのは難しいでしょう:-(一つの解決法は、あなたが探している型を特殊な属性で飾ること、それを探すことです。
追加された 著者 Fischermaen,
@イヴァンベンコ:私たちはすでにそれを試みました...
追加された 著者 Fischermaen,
(フィルタリングした後、リストは空です。)デバッグでは、私の2 DependencyObject(DLLから読み込むとき)のためにこれを得ました:BaseType = {Name = "DependencyObject" FullName = "System.Windows.DependencyObject"}そして最後のクラスIはこれを持っています:BaseType = {Name = "Object" FullName = "System.Object"}
追加された 著者 Guillaume Slashy,
何も動作しません、任意のオブジェクトはフィルタに一致します:(
追加された 著者 Guillaume Slashy,
私がしなければならない使用のために、それはOKですが、実際に私のDependencyObjectはフィルタリングされていません!私があなたを読んだとき、私はあなたがフィルターをかけたあまりにも多くのアイテムを持っているということを意味すると思いますが、実際、DependencyObjectはあなたのコードでフィルターに "true"を返しません:
追加された 著者 Guillaume Slashy,
これは非常に奇妙です.. IsAssignableFromはうまくいくはずです
追加された 著者 Ivan Bianko,

それは私の広告で動作します。

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 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;
    }

どのような2番目の問題について..あなたのプロパティ/フィールドの命名規則を守る必要があります

0
追加された
OK、DependencyPropertiesのために入手してください、私はDependencyPropertyか "一般的なプロパティ"かどうかを判断するために使用できるフィールドがあると思っただけです。 DependencyObjectのフィルタについて、コードは2番目のクラスをフィルタリングしますか?私はそれをしようとすると、あなたのすべてをフィルタリング...リストはフィルタ操作後に空です...
追加された 著者 Guillaume Slashy,
私の場合、メソッド(QtObject、Timer、AnotherClass)を入力すると3つのタイプがあり、フィルタリング後に0が得られます
追加された 著者 Guillaume Slashy,
.NET Framework 4
追加された 著者 Guillaume Slashy,
私はそれがどのようにすべてをフィルタすることができるかわかりません.. 私のスナップショットを見てください
追加された 著者 Ivan Bianko,
@ GuillaumeCogranne、あなたは.netフレームワークのどのバージョンを使用していますか?
追加された 著者 Ivan Bianko,
@GuillaumeCogranneはこの質問を見てください。おそらく同じ問題があります
追加された 著者 Ivan Bianko,