2011-05-08 28 views
6

Uygulamam çalışma zamanında C++/cli code çözümlemek için yansıma kullanır. Yapıcı bir işaretçi yer alırBir ConstructorInfo nesnesinin yönetilmeyen bir parametresi olup olmadığını nasıl belirleyebilirim?

ConstructorInfo constructorInfo; 
// ... 
var ret = constructorInfo.Invoke(BindingFlags..., null, myParameters, null); 

eğer nesnenin kontrol edilemeyen bir parametre olarak: i kullanmak daha sonra istiyorum çünkü
I, tip yönetilmeyen parametrelerine (işaretçiler ve gibi) olmadan bir kurucu sahip olup olmadığını belirlemek için gereken ona boş geçirdiğimde bir döküm istisnası var.

Bunu nasıl belirleyebilirim? IsManaged ... ve IsPointer bu durumda yardımcı olmaz.

+0

Neden IsPointer' yardımcı değil? – Gabe

+0

Diğer bir çok yönetilen nesne IsPointer (yani diziler) için True döndürecektir ... – seldary

+0

A * işaretçisi * bir diziye "IsPointer" için True döndürecektir. Ayrıca, bir C++ dizisi bir işaretçi olarak temsil edilir, böylece bir nesneye bir işaretçi ve bir nesne dizisi esas olarak özdeştir. Bunların hiçbiri, .NET'te gerçek dizi türleri olarak kabul edilmez. – Gabe

cevap

2

Burada aslında is ne sorun temizlemek ama değil bağımsız değişken olarak bir işaretçi alır ve IsPointer ile algılayan bir yapıcısına null geçen gösterir kısa bir gösteri programı:

 
It worked! 
True

+0

Soruya yorumunuza bakın ... IsPointer, True (Gerçek) olarak döndürülür, ancak diğer yönetilen türlerde olduğu gibi - başka bir tür için yönetilmeyen VE false için geçerli olan bir sınava ihtiyacım var. Teşekkürler! – seldary

+0

@seldary: "IsPointer" öğesi True değerini döndüren bir işaretçi türü olmadığını düşünüyorsanız, lütfen bana bunun ne olduğunu söyleyin. Ama hala null'un gerçek bir işaretçi için niçin geçemeyeceğiniz konusunda hala belirsiz değilim. – Gabe

+0

kötüyüm, IsPointer aslında işi bitiriyor! Teşekkürler... – seldary

-1

Parametre bir değer türü ise, sınayın. null, yönetilmeyen işaretçi veya sadece int olsun, herhangi bir değer türü için geçerli bir değer değildir. Bu yazdırır

using System; 
using System.Reflection; 

namespace pointers 
{ 
    unsafe class Program 
    { 
     public Program(int* x) 
     { 
      Console.WriteLine("It worked!"); 
     } 

     static void Main(string[] args) 
     { 
      ConstructorInfo[] c = typeof(Program).GetConstructors(); 
      c[0].Invoke(BindingFlags.Default, null, new object[] { null }, null); 
      Console.WriteLine(c[0].GetParameters()[0].ParameterType.IsPointer); 
     } 
    } 
} 

:

+0

Yönetilmeyen işaretçiler değer türleridir? – Gabe

+0

Özellikle, int * x = null; diyebilirsiniz, böylece herhangi bir işaretçi boş olabilir. – Gabe

+0

@Gabe: Tüm işaretçiler değer türleridir. Ve bir işaretçi için null değeri, bir 'null' nesne referansından farklıdır; Ya da en azından bu sorunun ne söylediği benim anlayışım ... –

İlgili konular