2008-11-07 17 views
60

Seri hale getirilmiş bir değer ve bir tür depolayan bir sınıfım var.Genel özellik oluşturma

public String Value { get; set; } 

public Type TheType { get; set; } 

public typeof(TheType) CastedValue { get { return Convert.ChangeType(Value, typeof(_Type)); } 

C# bu mümkün mü: Zaten dökme değerini döndüren bir özellik/yöntem gitmek istedik

+4

Genel özellikler güzel olurdu; Sanırım, var val = obj.Prop ', tür tabanlı bir arama için, daha kolay 'obj.Prop [typeof (Type)]' veya 'obj.GetProp ()'. – Dan

cevap

93

özelliğini içeren sınıf jenerik ise Mümkün, ve jenerik parametresini kullanarak mal beyanında:

class Foo<TValue> { 
    public string Value { get; set; } 
    public TValue TypedValue { 
     get { 
      return (TValue)Convert.ChangeType(Value, typeof(TValue)); 
     } 
    } 
} 

Alternatif yerine genel bir yöntemi kullanmak olacaktır:

class Foo { 
    public string Value { get; set; } 
    public Type TheType { get; set; } 

    public T CastValue<T>() { 
     return (T)Convert.ChangeType(Value, typeof(T)); 
    } 
} 

Bir sınıfın kendi dönüştürücüsünü tanımlamasına izin verdiğinden, dönüştürmek için System.ComponentModel.TypeConverter sınıflarını da kullanabilirsiniz.

Düzenleme:

Foo foo = new Foo(); 
foo.Value = "100"; 
foo.Type = typeof(int); 

int c = foo.CastValue<int>(); 

derleme zaman türünü bilmek zorunda: generic yöntemi çağrılırken derleyici bunu anlaması için bir yol vardır çünkü, sen genel tür parametre belirtmelisiniz unutmayın . Derleme zamanında türünü bilmiyorsanız o zaman bu durumda Foo sınıfa aşağıdaki özelliği ekleyebilir, bir object saklayarak olmalıdır:

public object ConvertedValue { 
    get { 
     return Convert.ChangeType(Value, Type); 
    } 
} 
+0

'Foo'nun sınıfının ikinci örneğinde şaşkınım: bir public property' türü bildirildi: "public Type TheType {get; set;}" ancak kodda kullanılmayacak şekilde görünüyor. teşekkürler, – BillW

+0

Özellik orijinal örneğindeydi. Sadece bıraktım. – Brannon

+0

Brannons çözümünü denediğimde, aldığım nesnenin IConvertible uygulamasını uygulaması gerektiğini söyleyen bir çalışma zamanı hatası alıyorum. Yanlış bir şey yaptım çünkü bu, kaynağa sahip olduğum bir dersi vermedikçe bir anlaşma kesicisi gibi görünüyor. – Keith

3

Ben örnek inanmıyorum sen Burada verilen mümkündür. CastedValue türü derleme zamanında tanımlanmalıdır; bu, bir çalışma zamanı değerine (TheType özelliğinin değeri) bağlı olamayacağı anlamına gelir.

DÜZENLEME: Brannon'un çözümü, bir mülk yerine genel bir işlev kullanarak bunun nasıl ele alınacağı konusunda bazı iyi fikirlere sahiptir.

52

Özellikler, olaylar, kurucular vs. jenerik olamaz - yalnızca yöntemler ve türler genel olabilir. Çoğu zaman sorun değil, ama bazen bir acı olduğunu kabul ediyorum. Brannon'un cevabı iki makul geçici çözüm sunuyor.

İlgili konular