การสร้างอินสแตนซ์ประเภท <T> ทั่วไปด้วยตัวแปรที่มี Type


85

เป็นไปได้ไหมที่จะบรรลุรหัสต่อไปนี้? ฉันรู้ว่ามันไม่ได้ผล แต่ฉันสงสัยว่ามีวิธีแก้ปัญหาหรือไม่?

Type k = typeof(double);
List<k> lst = new List<k>();

สับสนเล็กน้อยกับความคิดเห็นของคุณ "สามารถทำได้ใน C # 4.0" มันทำไม่ได้อย่างน้อยก็ไม่ใช่ในแบบที่คุณแสดง C # 4 ยังคงต้องมีการระบุพารามิเตอร์ประเภททั่วไปในเวลาคอมไพล์ คุณยังไม่สามารถส่งตัวแปร Type เป็นพารามิเตอร์ประเภททั่วไปได้
itowlson

1
กรุณาใช้วลีเป็นคำถามเมื่อเป็นคำถาม รหัสตามที่ระบุไม่สามารถทำได้ด้วย C # 4.0
Lasse V.Karlsen

1
คำถามที่คล้ายกัน: stackoverflow.com/questions/687363/…
Zach Johnson

ขออภัยเกี่ยวกับสิ่ง C # 4.0 ฉันหมายความว่าคำตอบสามารถใช้แนวคิดใน C # 4.0 ไม่จำเป็นว่าโค้ดจะทำงานใน C # 4.0 ขอบคุณสำหรับการแก้ไข DrJokepu
คริส

12
ฉันคิดว่าคำถามนี้มีการระบุไว้อย่างสมบูรณ์ - มีรายละเอียดที่เหมาะสม
RunHolt

คำตอบ:


119

ใช่มี:

var genericListType = typeof(List<>);
var specificListType = genericListType.MakeGenericType(typeof(double));
var list = Activator.CreateInstance(specificListType);

ฉันคิดว่านี่คือสิ่งที่ฉันต้องการ ให้ฉันตรวจสอบอีกครั้งและฉันจะทำเครื่องหมายว่าคุณเป็นคำตอบในไม่ช้า
คริส

3
ฉันคิดว่าปัญหาหลักคือคุณไม่ได้อธิบายสิ่งที่คุณต้องการให้เราฟัง คุณแสดงให้เราเห็นถึงความพยายามที่ล้มเหลวในบางสิ่งแล้วถามว่าจะทำสิ่งที่คุณต้องการได้อย่างไร หากคุณต้องการคำตอบ แต่ไม่ต้องเดาคุณควรอธิบายสิ่งที่คุณต้องทำแทนที่จะพยายามทำอย่างไร
Lasse V.Karlsen

โดยพื้นฐานแล้วฉันต้องการสร้างรายการ <> โดยที่ประเภทถูกระบุเป็นตัวแปร Type
คริส

3
ขอบคุณ David M รหัสของคุณทำในสิ่งที่ฉันต้องการ ขออภัยผู้ที่ไม่สามารถตอบได้เนื่องจากฉันไม่ได้ให้คำถามที่เพียงพอ
คริส

เป็นไปได้ไหมที่จะทำ sameway สำหรับ Generic Methods ฉันต้องการส่งผ่านประเภทไดนามิกสำหรับวิธีการฉันได้โพสต์ปัญหาของฉันไว้ที่ลิงค์ด้านล่างstackoverflow.com/questions/4101784/…
Mathiyazhagan

3

วิธีที่สะอาดกว่าอาจใช้วิธีการทั่วไป ทำสิ่งนี้:

static void AddType<T>()
    where T : DataObject
{
    Indexes.Add(typeof(T), new Dictionary<int, T>());
}

ฉันไม่แน่ใจว่าคุณหมายถึง "ดัชนี" เป็นตัวแปรที่ประกาศไว้ที่อื่นหรือไม่
พฤหัสบดี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.