2013-10-21 38 views
11

Diyelim ki bir veri alanını temsil eden bir nesneye sahibim, bu nesnenin aşağıdaki özelliklere ihtiyacı var: Ad, Tür, Değer, Uzunluk. Ben sadece belirli türde bir değeri atamak edebilmek için kod kullanıcıyı zorlamak istiyorum, çünkü,Genel nesnelerin genel listesi

class Field<T> 
{ 
    public string Name { get; set; } 
    public Type Type 
    { 
     get 
     { 
      return typeof(T); 
     } 
    } 
    public int Length { get; set; } 
    public T Value { get; set; } 
} 

Ben generics kullandık: İşte nesnedir.
Şimdi sorun, bir alan listesi oluşturmak istediğimde.
List<Field<object>> gibi bir liste oluşturursam, listedeki belirli bir Alana herhangi bir Değer atayabiliriz ve Tür için sorguladığımız zaman, 'object' alırız.
İşin aslı şu: bu listede dizeleri tutan birkaç alan isteyebilirim, az sayıda tutma yeri, tarih ve hatta özel nesneler de buna karşılık bir Alanlar listesi ...
Generics gibi bir şey için iyi bir çözümdür o? Eğer evet ise, bunu uygulamak için nasıl giderim? Değilse, daha iyi bir yol nedir?

--- DÜZENLEME ---
Biraz daha arka plan eklemek için:
1. Ben alanların listesini isteyebilir ve her alan öylesine gibi farklı veri türü tutacaktır:

List<Field<object>> lst = new List<Field<object>>(); 
lst.Add(new Field<string>()); 
lst.Add(new Field<int>()); 
lst.Add(new Field<SomeObjectFromMyApp>()); 

2. Daha sonra ben bu nesneleri sorgulamak zorunda kalacak ve otomatik olarak kendi nitelikleri bir döngü içinde, böyle bir şey:

foreach(Field<object> fld in lst) 
{ 
    Type t = fld.Type; 
    //do some other stuff 
} 
+0

Tam olarak ne istiyorsunuz? Bu cümleyi anlamıyorum: "bu listede dizeleri tutan birkaç alan isteyebilirim, az sayıda tutma yeri, tarihler ve hatta özel nesneler sırayla Alanların bir listesi olacak" – Florian

+0

Tam olarak ne söylediğini, birkaç tane alacağım Farklı alanlar listesi, ancak bu listedeki her Alan farklı veri türü (int, string veya bazı özel nesneler) tutuyor olabilir. –

cevap

9

Evet, jenerik iyi bir seçimdir. tip-emniyetini sağlamak (ve Type özelliğiyle tipini tanımlamak olmanın anahtarı listesi ve Field<T> sınıfın arasında bir soyutlama eklemektir.

Field<T> arabirimini IField uygular. Herhangi üye gerekmez Bu arayüz.

sonra. List<IField> olarak

yalnızca alanları içerecek biçimde listeyi sınırlamak Böylece listenizi beyan, ancak her alan farklı tipte olabilir.

sonra bu değerler yine, sadece yap okumak için

foreach(var field in list) 
{ 
    var type = field.Type; 
    .... 
} 
+0

Bu, listeyi oluşturma ile ilgili bir sorunu çözerdi, ancak değerleri geri okuma sorunu çözmezdi, çünkü şimdi uygun bir Alana <_type_> atmam gerekiyordu ve \ _type \ _'yi bilmeme imkan yok. o zaman ... –

+0

@DanielGruszczyk Neden döküm almalısın?Bunlardan ikisi de işe yarayacak: var field = liste [index] veya IField alan = liste [index] –

+0

Sınıfta bazı yöntemleri zorlayabildiğimden, arayüz aslında bana çok daha iyi uyduğundan dolayı kontrol edeceğim :) –

10

Sana bir arabirim tanımlamak için önermek ve Saha arayüzü

public interface IField 
    { 

    } 

public class Field<T> : IField 
    { 
     public string Name { get; set; } 
     public Type Type 
     { 
      get 
      { 
       return typeof(T); 
      } 
     } 
     public int Length { get; set; } 
     public T Value { get; set; } 
    } 

yüzden bu kodu yazabilirsiniz uygular:

var list = new List<IField>(); 

şimdi bu liste tip Field<T> herhangi bir nesneyi içerebilir

+1

Varolan bir cevabı tekrarlamanın yararı nedir? –

+7

Aralarında sadece 4 dakika vardı. Benim gibi yavaş bir talihsizsen, diğer cevabı fark etmemiş olabilirsin. –

+1

Evet Diğer cevabı görmedim :) – VahiD