2012-03-21 34 views
108

Bu yöntemi jenerik yapmanın bir yolu var, böylece bir string, bool, int veya double döndürebilsin mi? Şu anda, bir dizgeyi döndürüyor, ancak yapılandırma değeri olarak "doğru" veya "yanlış" bulamazsa, örneğin bir boole döndürmek istiyorum.Genel bir yöntemin dönüş türünü nasıl yapabilirim?

public static string ConfigSetting(string settingName) 
    { 
     return ConfigurationManager.AppSettings[settingName]; 
    } 
+0

(U tipi hatalardan bizi kurtarmak için IConvertible olmalı) burada nerede kısıtlamasını dikkat her ayarın türü nedir? – thecoshman

+2

Gerçekten sormak istediğim soru, "Uygulama yapılandırmamı nasıl yazılır?" Bununla birlikte, uygun bir cevap yazmak için çalıştığımdan çok uzun zaman geçti. – Simon

+0

Yah, ideal olarak, bu yöntemi yönteme aktarmak zorunda kalmak istemiyorum. Sadece bahsettiğim 4 tipe sahip olacağım. Yani "true"/"false" ayarlanmışsa, bu fonksiyonun bir booleanı (yönteme aktarmaya gerek kalmadan) döndürmesini istiyorum, muhtemelen int ve double'ı ikiye katlayabilirim ve her şey bir string olmalı. Cevaplanan soru çoktan işe yarayacak, ancak her seferinde türünü geçmem gerekiyor, ki bu muhtemelen iyi. – MacGyver

cevap

234

Böyle, bir jenerik yöntem yapmak gerekir:

public static T ConfigSetting<T>(string settingName) 
{ 
    return /* code to convert the setting to T... */ 
} 

Ama arayan bekledikleri türünü belirtmek gerekir.

public static T ConfigSetting<T>(string settingName) 
{ 
    object value = ConfigurationManager.AppSettings[settingName]; 
    return (T) Convert.ChangeType(value, typeof(T)); 
} 

Tüm bu iyi bir fikir, sen ...

+10

/* ayarı T'ye dönüştürmek için * ... ve/veya burada tüm romanı takip eder :) –

+1

Bu, elde etmek istediğiniz ayarın türünü bilmenizi gerektirmez, bu mümkün olmayabilir. – thecoshman

+0

@thecoshman: OP * * jenerik bir metodu istedi, yani verdiğim şey buydu - ama arayanın * ilgili tipi bilmesi gereken bir uyarıyla. –

20

Sen Convert.ChangeType() kullanabilirsiniz aklın olduğuna tamamen ikna olmuş değilim: Bu durumda, potansiyel olarak tüm ilgili türleri desteklenir varsayarak Convert.ChangeType kullanabilirsiniz :

public static T ConfigSetting<T>(string settingName) 
{ 
    return (T)Convert.ChangeType(ConfigurationManager.AppSettings[settingName], typeof(T)); 
} 
-1
private static T[] prepareArray<T>(T[] arrayToCopy, T value) 
    { 
     Array.Copy(arrayToCopy, 1, arrayToCopy, 0, arrayToCopy.Length - 1); 
     arrayToCopy[arrayToCopy.Length - 1] = value; 
     return (T[])arrayToCopy; 
    } 

benim kod boyunca bu performans ve bir yöntem haline koymak için bir yol istedi. Bunu burada paylaşmak istedim, çünkü dönüş değeri için Convert.ChangeType'ı kullanmak zorunda değildim. Bu en iyi uygulama olmayabilir ama benim için çalıştı. Bu yöntem, bir dizi genel tür ve dizinin sonuna eklenecek bir değer alır. Dizi daha sonra soyulmuş ilk değerle kopyalanır ve yönteme alınan değer dizinin sonuna eklenir. Son şey, genel diziyi döndürmem.

0

1/Düz yaklaşım

  1. Seçeneği (OP sorununa özgü önceliğe göre listelenmiş) Bunu yapmanın pek çok yolu vardır - oldukça jenerik birine sahip daha her tip için birden fazla işlevi oluşturma beklediğiniz işlevi. nesneye değer Cast ve ardından genel tipe -

    public static bool ConfigSettingInt(string settingName) { return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]); } 
  2. Seçenek 2/dönüşüm fantezi yöntemleri kullanmak istemiyorum

    .

    public static T ConfigSetting<T>(string settingName) 
    { 
        return (T)(object)ConfigurationManager.AppSettings[settingName]; 
    } 
    

    Not - cast (davanız) geçerli değilse Bu bir hata atar. Eğer tip döküm konusunda emin değilseniz Doğrusu tercih edin, bunu tavsiye etmem 3.

  3. tipi emniyet ile 3/Jenerik Seçeneği - tipi dönüşüm işlemek için genel bir işlev oluşturun.

    public static T ConvertValue<T,U>(U value) where U : IConvertible 
    { 
        return (T)Convert.ChangeType(value, typeof(T)); 
    } 
    

    Not - T beklenen türüdür, bilmek için bir yol var mı

+0

Neden üçüncü seçenek 'U' içinde genel yapmak? Bunu yapmanın bir anlamı yok ve yöntemi çağırmak zorlaştırıyor. Bunun yerine sadece 'Converible 'kabul et. Sorulan soruya cevap vermemesi göz önüne alındığında, bu soru için ikinci seçeneği dahil etmeye değer olduğunu düşünmüyorum. Muhtemelen ilk seçenekte de yöntemi yeniden adlandırmanız gerekir ... –

İlgili konular