[英]C# Get Instance of type char*
是否有可能在運行時獲取指針的實例? 就像是:
Type x = typeof(char*);
我如何獲得該指針的實例? 問題是我只有一個帶有類型的對象。 而且我知道Type是一個指針。 但是現在我需要一個指針實例。
您可以:
Type typeChar = typeof(char);
Type ptrChar = typeChar.MakePointerType(); // char*
然后回來:
if (ptrChar.IsPointer)
{
Type typeChar2 = ptrChar.GetElementType(); // char
}
但是也許您想要的是不同的東西:
public class TestBool
{
unsafe public void Test(bool* pointer)
{
*pointer = true;
}
public void Test2(ref bool reference)
{
reference = true;
}
}
public class TestChar
{
unsafe public void Test(char* pointer)
{
*pointer = 'A';
}
public void Test2(ref char reference)
{
reference = 'B';
}
}
public static void TestPointer(object obj, Type parType)
{
var pointerMethod = obj.GetType().GetMethod("Test");
Type parType2;
// Non-blittable types aren't directly supported.
// See https://msdn.microsoft.com/en-us/library/75dwhxf7.aspx
// We cheat a little.
if (parType == typeof(bool))
{
parType2 = typeof(byte);
}
else if (parType == typeof(char))
{
parType2 = typeof(short);
}
else if (parType.IsEnum)
{
parType2 = Enum.GetUnderlyingType(parType);
}
else
{
parType2 = parType;
}
object obj2 = Activator.CreateInstance(parType2);
GCHandle handle = default(GCHandle);
try
{
handle = GCHandle.Alloc(obj2, GCHandleType.Pinned);
pointerMethod.Invoke(obj, new object[] { handle.AddrOfPinnedObject() });
}
finally
{
if (handle.IsAllocated)
{
handle.Free();
}
}
if (parType == typeof(bool))
{
obj2 = (byte)obj2 != 0;
}
else if (parType == typeof(char))
{
obj2 = (char)(short)obj2;
}
else if (parType.IsEnum)
{
obj2 = Enum.ToObject(parType, obj2);
}
Console.WriteLine(obj2);
}
public static void TestReference(object obj, Type parType)
{
var referenceMethod = obj.GetType().GetMethod("Test2");
object obj2 = Activator.CreateInstance(parType);
var pars = new object[] { obj2 };
referenceMethod.Invoke(obj, pars);
Console.WriteLine(pars[0]);
}
private static void Main(string[] args)
{
{
var obj = new TestBool();
TestPointer(obj, typeof(bool));
TestReference(obj, typeof(bool));
}
{
var obj = new TestChar();
TestPointer(obj, typeof(char));
TestReference(obj, typeof(char));
}
}
看看TestPointer
,忽略非可遷移類型的一些問題,我簡單地使用GCHandle
來獲取指向該值的指針,然后將其直接傳遞給該方法。 無需不安全的代碼:-)
對於TestReference
它要容易得多:我只需要單獨創建parameters數組,然后CLR會將修改后的值放入該數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.