2012-03-25 13 views
6

Listemin sabit türde olmasını istemiyorum. Daha ziyade, Listenin yaratılmasının değişken türüne bağlı olmasını istiyorum. Bu kod çalışmaz:Dinamik bir tür nasıl oluşturulur List <T>

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Collections.Generic; 
namespace ConsoleApplication3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      string something = "Apple"; 

      Type type = something.GetType(); 

      List<type> list = null; 

      Console.ReadKey(); 

     } 
    } 
} 

herkes Bunun doğru çalışmasını sağlamak için yapmaları gereken değişiklikleri bana söyleyebilir misiniz? list'un oluşturulmasını something

+3

Bunun için yansıma kullanmanız gerekir. Statik olarak yazılan değişkenleri kullanamazsınız. Ya da farklı bir yaklaşım bul. –

+1

Bunu neden yapmak istiyorsunuz? – svick

+0

"Tip güvenliği istiyorum ama dinamik tip güvenliğe ihtiyacım var." Bunu detaylandırır mısın? –

cevap

27
string something = "Apple"; 
Type type = something.GetType(); 
Type listType = typeof(List<>).MakeGenericType(new [] { type }); 
IList list = (IList)Activator.CreateInstance(listType); 

Bu, statik olarak bilinmeyen türden bir liste oluşturduğunuz şekildedir. Ancak, listenin çalışma zamanı türünü statik olarak belirtemeyeceğinizi unutmayın. Jenerik olmayan bir tip veya hatta nesne kullanmanız gerekir.

Ne yapmak istediğinizle ilgili daha fazla şey bilmeden, yapabileceğiniz en iyisi budur.

+1

Serin! Dışında var gerek. – Jaggu

+2

@Jaggu Hayır, 'var' düşündüğünüz şeyi yapmayacak. 'Var' statik bir yazım yapısı olduğundan, ' Listesini yazınız. –

+0

Bu, çalışma zamanı türlerini liste işlemleri üzerinde kontrol edecek mi? Yani, "Apple" türünde olmayan bir şey eklemeyi denerseniz, bir çalışma zamanı hatası oluşacak mı? –

0

değişkenine bağlı olarak oluşturmak istiyorum Derleyici derleme zamanında genel T türünü bilmelidir. Yani hayır, bunu gerçekten yapamazsın.

5

Tip güvenliği istiyorum ancak dinamik tip güvenliğe ihtiyacım var. Eğer çalışma zamanı tip-emniyet istemek demek durumunda

, siz (usr cevabını bakın) veya dynamic yansıma kullanarak List<T> oluşturmak ve daha sonra genel olmayan IList gibi davranabilirsiniz. dynamic kullanma

, böyle görünecektir:

static List<T> CreateListByExample<T>(T obj) 
{ 
    return new List<T>(); 
} 

… 

object something = "Apple"; 

IList list = CreateListByExample((dynamic)something); 

list.Add(something); // OK 

list.Add(42);  // throws ArgumentException 
1

tüm dinamik ve yansıma iyi çalışıyor - vb kaybetme güçlü yazarak, kod tasarımı/netlik
- ama performansı üzerinde olumsuz ile her zaman denemek ve/ o o w şeyler çözmelidir yani -, ... kodunuzu izin veriyorsa eğer yapabilirsen
Yani ve (not) özel kod üzerine (çok fazla) bağlı olarakihtiyacı sen de jenerik ...

class Program 
{ 
    static void Main(string[] args) 
    { 
     string something = "Apple"; 
     int test = 5; 
     var list = something.GetList(); 
     var listint = test.GetList(); 
     Console.WriteLine(list.GetType()); 
    } 
} 
static class Extension 
{ 
    public static List<T> GetList<T>(this T value) 
    { 
     return new[] { value }.ToList(); 
    } 
} 

... yani türü 'anlaması' bir 'hile' kullanıp yapabiliriz. Eğer bir değişken için ve 'girilmesi' jenerik bağlamda önce bir değeri varsa,
(bu çevrede çok faydalı olacaktır) uzantıları, kullanmak ve türünü ve bir liste türünü tahmin izin verebilir için sen
NOT: Bu 'maalesef' maalesef her zaman dışarı çıkmaz ve kodunuz ne zaman 'çok dinamik' (bu durumun 'kesin' olduğunu biliyorum ama bunun kapsamı dışındadır) ve eğer yansıma kaynaklı türlere bağlıysa ve bu durum
yani temiz bir çözüm yoktur, bu sadece bir örnektir, sizin için biraz ter dökmeniz gerekir :) Burada ve burada bir sarıcı türü gerekebilir ve bu şekilde bir liste oluşturmak istediğiniz gibi olmayabilir.

İlgili konular