Bir Bağdaştırıcıdan ve DependencyProperties bir DLL/derleme filtre?

Bir DLL oluşturmak için aşağıdaki kodu aldım:

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
    }

Şimdi SADECE DependencyObject/Properties almak istiyorum. ("property" nbSimu "olmaksızın ve nesne olmadan" AnotherClass ")

İşte sahip olduğum kod:

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

Ben denedim üçüncü satırda:

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

Herhangi bir hata söylemiyor ama hiçbir şeyi filtrelemiyor ...

Ve DependencyProperties'i filtrelemeyle ilgili olarak, nasıl yapılacağına dair bir fikrim yok ...

Her iki konuda da yardımlarınız için şimdiden teşekkür ederiz.

1

2 cevap

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

0
katma
@GuillaumeCogranne: Şimdi, işe yaramalı. Örneği düzelttim. İlk başta yanlış ipucu için özür dilerim.
katma yazar Fischermaen, kaynak
Sorun budur. WPF'deki birçok obekt, ​​DependencyObject'in bir alt sınıfıdır. Yani bu şekilde filtrelemek zor olacaktır :-( Bir çözüm, aradığınız türleri özel bir özellik ile dekore etmek ve bunu aramak olabilir.
katma yazar Fischermaen, kaynak
@IvanBenko: Bunu zaten denedik ...
katma yazar Fischermaen, kaynak
doesnt work :( filtrelemeden sonra, liste boş Yardım etmek için, debug olarak 2 DependencyObject için (DLL'den okurken) bunu aldım: BaseType = {Name = "DependencyObject" FullName = "System.Windows.DependencyObject"} Ve Son sınıf bunu aldım: BaseType = {Name = "Object" FullName = "System.Object"}
katma yazar Guillaume Slashy, kaynak
de çalışmıyor, filtre ile eşleşen herhangi bir nesne :(
katma yazar Guillaume Slashy, kaynak
Yapmam gereken kullanım için sorun değil ama aslında benim DependencyObject filtrelenmemiş olmasıdır! Seni okuduğumda, filtrelemeden sonra çok fazla ürün alacağımı kastediyorsun ama gerçek şu ki, şimdi, DependencyObject, filtrede "true" ifadesini kodlarına yazmıyor :(
katma yazar Guillaume Slashy, kaynak
Bu çok garip .. IsAssignableFrom çalışmalı
katma yazar Ivan Bianko, kaynak

Benim için çalışıyor.

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

İkinci sorundan ne haber .. mülkünüzün/alanlarınızın sözleşmesini adlandırmaya devam etmelisiniz

0
katma
Tamam, DependencyProperties için olsun, sadece bir DependencyProperty veya bir "genel özellik" olup olmadığını belirlemek için kullanabileceğimiz bir alan olduğunu düşündüm. DependencyObject öğesinin filtrelenmesi hakkında kodunuz 2. sınıfı filtreler mi? Filtreyi denediğimde her şey ... filtre işleminden sonra liste boş ...
katma yazar Guillaume Slashy, kaynak
Benim durumumda, metoduma girdiğimde 3 tipim var (QtObject, Timer ve AnotherClass) ve filtrelemeden sonra 0 tane aldım.
katma yazar Guillaume Slashy, kaynak
.Net çerçeve 4
katma yazar Guillaume Slashy, kaynak
Her şeyi nasıl filtreleyebileceğini bilmiyorum .. Anlık görüntüye bakma
katma yazar Ivan Bianko, kaynak
@GuillaumeCogranne, hangi .net framework sürümünü kullanıyorsunuz?
katma yazar Ivan Bianko, kaynak
@GuillaumeCogranne bu sorusuna bakarsanız, belki de aynı sorunla karşılaşırsınız
katma yazar Ivan Bianko, kaynak