2015-10-04 20 views
6

Bazı kod var ....Yerel değişken tür olarak nasıl kullanılır? Derleyici, "bu bir değişken gibi kullanılır ama bir türü gibi kullanılır"

Çalışma zamanı ortamında, ne tür bir tür v1 değişkeni olduğunu bilmiyoruz! Bu sebeple "if else" ifadesini bir çok kez yazmalıyız!

  if (v1 is ShellProperty<int?>) 
      { 
       v2 = (v1 as ShellProperty<int?>).Value; 
      } 
      else if (v1 is ShellProperty<uint?>) 
      { 
       v2 = (v1 as ShellProperty<uint?>).Value; 
      } 
      else if (v1 is ShellProperty<string>) 
      { 
       v2 = (v1 as ShellProperty<string>).Value; 
      } 
      else if (v1 is ShellProperty<object>) 
      { 
       v2 = (v1 as ShellProperty<object>).Value; 
      }   

4 kere yazdım! fark sadece ShellProperty < anytype içindedir>

Bunun yerine bu kullanarak çizgileri bir sürü yazı "eğer başka ifadesi" Ben çalışma anında özellik türü almak için kullanılması Yansıma kullanmaya karar
!

 Type t1 = v1.GetType().GetProperty("Value").PropertyType; 
    dynamic v2 = (v1 as ShellProperty<t1>).Value; 

Bu kod PropertyType tür v1 ve atar güzel lo yerel değişken t1 ne alabilirsiniz.
Ama sonra benim derleyici "t1 bir değişkendir ama bir tip gibi kullanılan" yüzden beni ShellProperty içindeki t1 yazmak için izin vermez
söylüyor, <>

nasıl bu sorunu çözmek için ve nasıl söyle sahip olduğumdan daha kompakt kod almak için?
Yeni sınıf oluşturmak gerekli mi?

+1

Bu şekilde jenerik kullanamazsınız. Jenerikler derleme zamanında güçlü bir şekilde yazılmıştır. –

+0

Yani, bu şekilde – IremadzeArchil19910311

+0

mümkün olmadığı anlamına gelmiyor. ama sen zaten dinamik yapıyorsun. –

cevap

8

bakınız yapabilirsiniz Sen sadece MakeGenericType bir çağrı eksik, çok yakındılar.

ben kod aşağıdaki gibi görünecektir inanıyoruz:

Type t1 = v1.GetType().GetProperty("Value").PropertyType; 
var shellPropertyType = typeof(ShellProperty<>); 
var specificShellPropertyType = shellPropertyType.MakeGenericType(t1); 
dynamic v2 = specificShellPropertyType.GetProperty("Value").GetValue(v1, null); 

Düzenleme: @PetSerAl olarak ben gereksiz dolaylama bazı katmanları ekledi dikkat çekti. Maalesef OP, muhtemelen bir tane astar isteyebilirsiniz:

dynamic v2 = v1.GetType().GetProperty("Value").GetValue(v1, null); 
+0

Bu tam olarak istediğim gibi çalışıyor! Teşekkür ederim! – IremadzeArchil19910311

+1

Bu: v1.GetType(). GetProperty ("Değer"). GetValue (v1, null) 'yeterli değil mi? – PetSerAl

+0

@PetSerAl Kesinlikle haklısınız, çok aptal hissediyorum. Orijinal koda bakmak için çok zaman harcadım ve cevabımı düşünmek için yeterli zaman yoktu. Şimdi güncelleyeceğim. – Dex

5

Jenerikler için bunları dinamik olarak oluşturmanız gerekir.

MethodInfo method = typeof(Sample).GetMethod("GenericMethod"); 
MethodInfo generic = method.MakeGenericMethod(myType); 
generic.Invoke(this, null); 

genel bir nesne oluşturmak için,
var type = typeof(ShellProperty<>).MakeGenericType(typeof(SomeObject)); 
var v2 = Activator.CreateInstance(type); 

Initializing a Generic variable from a C# Type Variable

İlgili konular