2012-05-18 40 views
5

Temel sınıfımda statik bir yöntem oluşturma zorunluluğuyla karşı karşıyayım, ancak tür argümanlarını bildirmem gerektiğini beğenmedim, bu yüzden bu konuda gidip gitmediğimi merak ediyorum. doğru yol.Statik yöntemi tanımlamanın daha iyi bir yolu

Temel olarak, sınıftaki özellikleriyle ilişkilendireceğim temsilciler atayım. Ben kolayca şöyle, kalıtsal sınıfları yöntemi bırakabilir: Bir uzatma sınıfında,

public class Foo 
{ 
    public string Property1 { get; set; } 
} 

public class InheritsFoo : Foo 
{ 
    public void AssignDel<TVal>(
     Expression<Func<InheritsFoo, TVal>> expr, 
     Action<InheritsFoo, TVal> action) 
    { 
    } 
} 

Ya ben bunu:

public static void AssignDel<T, TVal>(
    this T source, 
    Expression<T, TVal>> expression, 
    Action<T, TVal> action) 
    where T : Foo 
{ 
} 

Bunların her ikisi de AssignDel kullanmak için bana sağlayacak örneklenmiş sınıf:

var foo = new InheritsFoo(); 
foo.AssignDel(x => x.Property1, handler); 

Ama AssignDel statik yapmak için bir gereksinim var. Bu uzatma yolunu işe yaramaz hale getirir. Hala InheritsFoo'da çalışıyor, ancak bunu temel sınıfa taşımak istiyorum. Ben çalışırsanız, jenerik argüman anlaşılmaktadır ve ben yöntemin kullanımını değiştirmek zorunda edilemez:

InheritsFoo.AssignDel<InheritsFoo, string>(x => x.Property1, handler); 

bir yolu ben düşünce değil bunu yapmanın başka bir yolu, dışarı var mı?

DÜZENLEME: uzantı yönteminin işe yarayıp yaramayacağı hakkında yorumlarda sorunu gidermek için ... @Mark M. tarafından başvurulan URL'ye gittim.

InheritsFoo foo = null; 
foo.AssignDel(x => x.Property1, handler); 

Bu derleme (eğer çalışacak olsa bile bilmiyorum). Yine de, bunun bir statik yöntem olarak nitelendirileceğini düşünmeyin, çünkü 'foo' hala bir örnek olarak kabul edilir; Boş bir örnek, ancak yine de bir örnek.

+3

Uzantı yöntemleri zaten statik. Yöntemi durağan hale getirme gereksinimi, uzantı yöntemlerini kullanma biçiminde nasıl yapılır? –

+3

"AssignDel 'statik yapmak için bir ihtiyacım var". Sonra statik yapınız. –

+1

@Kirk: Uzantı yöntemleri statik yöntemler olarak tanımlanmış olsa da, yalnızca amaçlanan sınıfın örnek yöntemleri olarak kullanılabilirler. –

cevap

0

ben sadece miras zincirinde başka seviyesini uygulayarak gerekli yapmak başardı yardımcı olur.

public class Foo 
{  
    public string Property1 { get; set; } 
} 

public class Foo<T> : Foo 
{ 
    public static void AssignDel<TVal>(Expression<Func<T, TVal>> expr, Action<T, TVal> action) 
    { } 
} 

public class InheritsFoo : Foo<InheritsFoo> 
{  } 

InheritsFoo'ya ihtiyacım olduğu gibi davranabilirim.

1

Ancak AssignDel'i statik yapmak zorundayım. Bu, uzantı yolunu işe yaramaz hale getirir. Hala InheritsFoo'da çalışıyor ama Gerçekten bunu temel sınıfa taşımak istiyorum. Ben çalışırsanız, jenerik argüman anlaşılmaktadır ve ben yöntemin kullanımını değiştirmek zorunda edilemez:

Bu anlamda büyük bir yapmaz.

InheritsFoo.AssignDel statik bir yöntemdir.

Belirtilen statik yöntemi InheritsFoo.AssignDel<InheritsFoo, string>(x => x.Property1, handler); yaparak arayarak gereksinimlerinizi karşılar gibi görünüyor.

Geldiğiniz ikinci seçenekte neyin yanlış olduğunu anlamıyorum. Yapmanız gerekeni yapar, ne olduğu açık, gerçekten ve string'u foo.AssignDel(x => x.Property1, handler); yerine geçtiniz mi?

Sadece aşağıdakileri yapabilir ve istediğinizi elde edersiniz. Eğer tam olarak ne istediğinizi olan InheritsFoo.AssignDel(x => x.Property1, handler); kullanmak olacağını görünüyor çünkü

public class Foo 
    { 
     public string Property1 { get; set; } 
    } 

    public class InheritsFoo : Foo 
    { 
     public static void AssignDel<TVal>(
      Expression<Func<InheritsFoo, TVal>> expr, 
      Action<InheritsFoo, TVal> action) 
     { 
     } 
    } 

bir şey eksik olması gerekir.

+0

Jenerik argümanlarının belirtilmesi işe yarar, ancak özellikle TV türü argümanında tercih edilenden daha ayrıntılıdır. Bu yüzden alternatifler istiyorum. – Random

1

Uzantı yöntemi zaten statik.Eğer uzatma yöntemi şekilde kullanmayın zorunda düşünürsek

, bu çalışması gerekir:

InheritsFoo.AssignDel(x => x.Property1, handler); 

Aynı şekilde derleyici uzantısı yöntemi form için tip parametrelerini infere olacak, bu olacak eski için moda statik bir yol. İki tip parametrelerle birlikte yöntemine sahip gerekiyorsa

, bir jenerik bunun için sınıf oluşturabilir: Bu durumda

public class Foo<T> where T : Foo { 

    public void AssignDel<TVal>(Expression<Func<T, TVal>> expr, Action<T, TVal> action) 
    { 
     //... 
    } 
} 

, bunu yapabilirsiniz:

Foo<InheritFoo>.AssignDel(x => x.PropertyFromInheritFoo, handler); 

As you can bakın, sadece bir tip parametresini bildirmeniz gerekir, diğeri çıkarılır.

o

+0

Bu yöntem, temel Foo sınıfına taşımak istediğimde, InheritsFoo'da yöntemi saklarsam çalışır. – Random

+0

Oh! Karşılaştığın problem bende. Görünüşe göre vida :( – ivowiblo

+0

Öyleyse, anladım mı kontrol edeyim: Foo sınıfındaki yönteme sahip olmak ve tüm hiyerarşinin özelliklerini kabul etmek ister misin? – ivowiblo

İlgili konular