2010-01-24 20 views
7

Böyle bir soyut dersim var;Geçerli tür statik, genel bir yöntemde mi geliyor?

public abstract PropertyBase 
{ 
    public static System.Type GetMyType() 
    { 
     return !!!SOME MAGIC HERE!!! 
    } 
} 

ben alt sınıf istiyorum, ben statik GetMyType() çağırdığınızda, ben alt sınıfın tipini iade etmek istiyorum. Yani bir alt tipi bildirirsem; Ben

var typeName = ConcreteProperty.GetMyType().Name; 

ben ayarlanması gerekir 'typeName' bekliyoruz diyoruz sonra

public class ConcreteProperty: PropertyBase {} 

"ConcreteProperty." Bunu yapmanın bir yolu olmadığını sanıyorum, ama dışarıda birileri bu bilgiyi elde etmenin bir yolunu biliyorsa ilgileniyorum.

(I çözmeye çalışıyorum problem WPF bağımlılık özelliklerinin ayrıntı olduğu;

class NamedObject : DependencyObject 
{ 
    // declare a name property as a type, not an instance. 
    private class NameProperty : PropertyBase<string, NamedObject> { } 

    // call static methods on the class to read the property 
    public string Name 
    { 
     get { return NameProperty.Get(this); } 
     set { NameProperty.Set(this, value); } 
    } 
} 

Ve neredeyse bir var; böyle bir şey yapabilmek isterdim uygulanması, ama oldukça benim NameProperty sınıfının dışında ihtiyaç bilgileri alınamaz)

+0

Statik olmasının nedeni nedir? Sanal ya da soyut olarak bildirilen sorun olurdu –

+0

NEDEN STATİK: Bu garip bir açı ve bir C# gerçekten tasarlanmamıştır. Bazen türünüz sadece bir değere sahip olabilir. Yani 'sınıf Steve: Person {}' bir tür bildirir, ancak yalnızca bir olası değer olduğundan, 'Steve' sınıfı da bir örneği tanımlar. 'Steve' türünü ilan etmek singleton 'Steve'i ilan ediyor. WPF DP'ler şöyle; örnek veri, meta veri veya tür olup olmadıklarına karar veremezler. Hepsini bir kod yapısına katlamaya çalışıyorum. Hepsi spekülatif bir ATM, ama ben kendi iyiliği için onu takip etmekle ilgileniyorum. –

+0

İşte bu yüzden buna ihtiyacım var: Boilerplate TypeDescriptor kodu için kısmi bir sınıf oluşturma. Dinamik olarak oluşturulan özellik adları, türünde tanımlanmış özelliklerle çakışamaz. Bu nedenle, bir kontrol için türdeki özellik adlarının bir listesine ihtiyacım var. Bu daha fazla kodlu koddur ve bu nedenle kodgen içinde gider. Ayrıca değişmediği için statik için mükemmel bir adaydır.Bu yüzden, statik yapıcıda geçerli türün özelliklerini içeren bir liste oluşturmam gerekiyor. Şey, cehennem, şimdi T4 şablonunda sihirli ipleri kullanmam gerek. – Will

cevap

6

Sen kısmen (ulaşmak miras derin) kullanılarak jenerik 1 düzeyinde olabilir.

class PropertyBase<T> 
{ 
    public static Type GetMyType() { return typeof (T); } 
} 

// the base class is actually a generic specialized by the derived class type 
class ConcreteProperty : PropertyBase<ConcreteProperty> { /* more code here */ } 

// t == typeof(ConcreteProperty) 
var t = ConcreteProperty.GetMyType(); 
+0

Not: Bu yalnızca bir seviye çalışır, eğer ConcreteProperty'den inerseniz, yine de ConcreteProperty'yi GetMyType'dan döndürür. –

+0

Bu doğru. Ve bu yaklaşımın sınırlamalarından biri. Ancak, OP'nin bağımlılık mülk örneğinde hala yardımcı olabilir. – LBushkin

+0

Bu, şimdiye kadar gördüğüm en iyi yaklaşımdır; tür parametrelerine yeniden alıntı yapmak için tür referansı oluşturursunuz. Örneğim için, bu geliştirici üzerinde biraz daha yazarak daraltmakla birlikte, bu güzel çalışır. Her neyse, bu henüz en iyi ve çok yararlı. Teşekkürler. –

4

Alt sınıflama biti çalışmayacaktır, çünkü statik bir yöntem bir türe bağlanmıştır. Bir örnek yöntem değil, türünde yöntemidir. Alt tür bir taban türünün statik yöntemlerini içermez, çünkü bunlar farklı türlerdir ve statik yöntem taban türüne bağlanır. Derleyici, türetilmiş bir sınıfta olduğu gibi bir temel sınıfın statik yöntemini çağırmanıza izin verse de, gerçekte bu yöntemi temel sınıftan çağırır. Sadece sözdizimi şeker. Aynı nedenden dolayı, alt sınıflardaki statik yöntemleri “geçersiz kılamazsınız”, çünkü bu pek anlamlı olmaz.

0

Sadece bunun neden böyle bir şey yapması gerektiğini merak etmek? yöntemini çağırarak, sadece yanı yapabilirsiniz ederken

var typeName = ConcreteProperty.GetMyType().Name; 

neyse sen

var typeName = typeof(ConcreteProperty).Name; 

Bunu yapmak gerekir Sadece durumda, geçersiz kılmak "gölge" kullanabilirsiniz .. tipini biliyorum alt sınıfın çocuk sınıfında uygulanması.

public class ConcreteProperty : PropertyBase { 

     public new static Type GetMyType { 
      //provide a new implementation here 
     } 
    } 
+0

Maalesef örnek kodumda onu temel sorunlara indirgemek için basitleştirdim ve bu sizin tarif ettiğiniz şekilde çözülebilirdi. Ancak çözümümün gerektirdiği şey, PropertyBase'in herhangi bir alt sınıfı için 'gerçek tipiniz nedir' sorma yeteneğidir. Örneğin, this.GetType() işlevinin çağrılması, her zaman temel türden ziyade gerçek türü alır. –

İlgili konular