2009-02-03 27 views
8

Parametreler bir ben bir işlevi çağırmak ve bir Enum geçirebilirsiniz nasıl this question.C# Enum Fonksiyon olarak

itibaren takip eder misin?

Örneğin Aşağıdaki kod var:

enum e1 
{ 
    //... 
} 

public void test() 
{ 
    myFunc(e1); 
} 

public void myFunc(Enum e) 
{ 
    var names = Enum.GetNames(e.GetType()); 

    foreach (var name in names) 
    { 
     // do something! 
    } 

} 

rağmen bu ben 'e1' a 'tipi' olmasına karşın 'değişken' Hata iletisi gibi kullanılır alıyorum ne zaman. Yardımcı olabilecek herhangi bir fikir var mı?

Herhangi bir Enum üzerinde çalışmak için genel işlevini yalnızca belirli bir türde tutmaya çalışıyorum. Bu mümkün mü? ... Genel bir işlev kullanmak nasıl olur? Bu işe yarar mı?

+0

@TK türgüvenli geçenlerde düzenlemeyi bkz:

Yani, tip güvenliğini sağlamak için, Size işlevini değiştirebilir. –

+0

Bunu yapmak istediğiniz bir açıklama _why_ istiyorum. Bana göre, yaklaşımı birkaç adımdan tekrar gözden geçirecekseniz, bir problem için bir çözüm bulmaya çalışıyorsunuz, böylece bir açıklama gerçek sorun için bir çözüm bulmaya yardımcı olabilir. – dbemerlin

cevap

9
Sen genel işlevini kullanabilirsiniz

:

public void myFunc<T>() 
    { 
     var names = Enum.GetNames(typeof(T)); 

     foreach (var name in names) 
     { 
      // do something! 
     } 
    } 

ve çağrı gibi:

Eğer Enum veya enum için T sınırlamak çalışırsanız
myFunc<e1>(); 

(DÜZENLEME)

derleyici şikayet ediyor. ,

public static void myFunc<T>() 
    { 
     Type t = typeof(T); 
     if (!t.IsEnum) 
      throw new InvalidOperationException("Type is not Enum"); 

     var names = Enum.GetNames(t); 
     foreach (var name in names) 
     { 
      // do something! 
     } 
    } 
5

O tip bir örneği olarak enum türü geçirmek için çalışıyoruz - böyle bir şey deneyin:

enum e1 
{ 
    foo, bar 
} 

public void test() 
{ 
    myFunc(e1.foo); // this needs to be e1.foo or e1.bar - not e1 itself 
} 

public void myFunc(Enum e) 
{ 
    foreach (string item in Enum.GetNames(e.GetType())) 
    { 
     // Print values 
    } 
} 
+0

Bunun gibi bireysel değerleri alabileceğimin farkındayım. Ben sadece bir değil tüm değerleri yazdırmak demek için genel bir Enum bir işleve geçmek için arıyorum. –

+0

Bu, tüm değerleri basacaktır. Enum.GetNames (e.GetType()) kullanın. –

9

Neden türünü geçmediğine? gibi:

myfunc(typeof(e1)); 

public void myFunc(Type t) 
{ 
} 
+0

"if (e is Enum)" veya "as" ifadesini kullanırsam bir hata alıyorum. "System.Type" türünü "System.Enum" a dönüştürme, dönüştürme, kutucuk dönüştürme, dönüştürme veya null türü dönüştürme " –

+0

Hala Enum.GetNames (t) –

+0

kullanabilirsiniz. Herhangi bir tür yerine ony enums kullanıldığından emin olmak için bunu nasıl güvenli yazabilirim? –

0

kullanın

public void myFunc(e1 e) { // use enum of type e} 

yerine

public void myFunc(Enum e) { // use type enum. The same as class or interface. This is not generic! } 
+0

Sadece belirli bir türdeki herhangi bir Enum üzerinde çalışmak için genel işlevi tutmaya çalışıyordum? –