Linq

2010-08-10 24 views
6

LinQ T tip listesindeki her giriş atan dökme yöntemi içeren System.Type ile Cast. aşağıdaki gibi görünen bir liste var Sağlar ki: Linq

List<Object> obj = new List<Object>(); 
obj.Add("A"); 
obj.Add("B"); 

Bir çalışma dökme olabilir

var list = obj.Cast<string>(); 

Ben

Type t = typeof(String); 
Object list = obj.Cast(t); 
bir çözüm kullanmak olacaktır

çalışmak istiyorum ne yansıma ve genel olarak bir liste oluşturmak ve doldurmak ama daha iyi bir çözüm var mı merak ediyorum? .NET 4.0'ın bunu yapmanın bir yolu olabilecek bazı eş/karşıt varyansı desteklemesi gerektiğini duydum.


Ekstra Bilgi ve Yansıma Soulution

aşağıdaki The model item passed into the dictionary is of type System.Collections.Generic.List1[IStatisticEntry], but this dictionary requires a model item of type System.Collections.Generic.List1[CrashStatistic+CrashEntry] olduğunu olsun hatası. CrashEntry, IStaticEntry uygular, ancak liste genel bir türü olduğu için kullanılamaz.

İçinden aşağıdaki çözümü inşa isterim stille Yansıma olmadan bir şey gibi: Yalnızca çalışma zamanında bilecek tipine şey döküm gerekmez

public static object Cast(this IEnumerable list, Type type) 
    { 
     var newList = Activator.CreateInstance(typeof(List<>).MakeGenericType(type)); 

     foreach (var item in list) 
      newList.GetType().GetMethod("Add").Invoke(newList, new object[] { item }); 

     return newList; 
    } 
+0

http://geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx –

cevap

2

Bunu statik olarak yapmak, tek bir nesneyle yapabileceğinizden daha fazlasını yapmak mümkün değildir. Yapmanız neden istediğini oldukça anlamıyorum

static void Main(string[] args) 
{ 
    List<Object> obj = new List<Object>(); 
    obj.Add("A"); 
    obj.Add("B"); 

    var list = obj.Cast<dynamic>(); 
    foreach (var item in list) 
    { 
     Console.WriteLine(item[0]); 
    } 

    Console.ReadKey(); 
} 
+0

Yanıt için teşekkürler, ancak bunun bir sorun olduğunu düşünmüyorum. Belli bir modelin modelini bekleyen bir görünümü var ve ben bir parametre olarak türü aldım. –

+0

'un üstündeki sorun açıklamasıyla ilgili bazı bilgiler eklendi. Çalışma zamanı türüne (örneğin, 'Tür' örneğinin bir örneğine) sahipseniz ve derleme zamanı türünü (ör.,) Bir '' jenerik parametresi), o zaman yansıma veya 'dynamic' kullanmalıdır (ve' dynamic' kullanmak görünümünü değiştirmek zorunda kalacak. Yani, seçimleriniz: 1) Yansıma kullanın; 2) görünümü değiştirerek 'dinamik 'kullanın; 3) Tür, 'Type' örneği yerine jenerik parametre' 'yazın. –

+0

Yeterince adil, konuyla ilgili netlik için teşekkürler. typoes benim miktarı ile ben en güzel yolu görünümleri hala kesinlikle yazılı modellerle çalışmasını :) sağlamak için Yansıma çözüm olduğuna inanıyoruz –

0

. Yayınlanacak olan nesnenin türü değişmeyecektir çünkü eğer dizeyse daha sonra bir dizge olacak ve dizge veya nesne değişkenine atayacağınız önemli değildir.

Yansıma yöntemleriyle çalışırken gerçek bir nesne türüne dökülmeye özen göstermeniz gerekmez. Bir nesne değişkeni olarak kalabilir, çünkü yansıma kullanırken, herhangi bir döküm olmaksızın, tüm gerçek tip üyelerine erişebilirsiniz.

+0

Yukarıdaki hata açıklamasını ekledim, daha açık bir fikir verdiğini düşünün demek istedigim. –

4

: altta yatan türe dökme değil gerekli olduğunu bu yüzden

Type t = typeof(string); 
var x = (t)obj; // invalid 

Ancak, dinamik unsurları tedavi etmek mümkündür Bu ancak yansıma yoluyla Enumerable.Cast<T> uygulayarak herhangi:

List<object> objectList = new List<object> { "Foo", "Bar" }; 
object stringSequence = typeof(Enumerable) 
    .GetMethod("Cast", BindingFlags.Public | BindingFlags.Static) 
    .MakeGenericMethod(typeof(string)) 
    .Invoke(null, new[] { objectList }); 

hangi durumda stringSequence çalışma zamanı tip IEnumerable<string> uygulamaya koyacak.

+0

1 Bayım, bir beyefendi ve alim hem de. –