Có thể ai đó giải thích hoặc giải thích tại sao thời gian kiểm tra kiểu không xảy ra trong mẫu dưới đây - chuỗi tài sản có thể được đặt thành bất kỳ giá trị ...
Bị kẹt với điều này ở nơi rất bất ngờ và thực sự ngạc nhiênDynamicMethod và loại kiểm tra
using System;
using System.Reflection;
using System.Reflection.Emit;
namespace Dynamics
{
internal class Program
{
private static void Main(string[] args)
{
var a = new A();
a.Name = "Name";
Console.WriteLine(a.Name.GetType().Name);
PropertyInfo pi = a.GetType().GetProperty("Name");
DynamicMethod method = new DynamicMethod(
"DynamicSetValue", // NAME
null, // return type
new Type[]
{
typeof(object), // 0, objSource
typeof(object), // 1, value
}, // parameter types
typeof(Program), // owner
true); // skip visibility
ILGenerator gen = method.GetILGenerator();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Call, pi.GetSetMethod(true));
gen.Emit(OpCodes.Ret);
SetValue setMethod = (SetValue)method.CreateDelegate(typeof(SetValue));
int val = 123;
setMethod(a, val);
Console.WriteLine(a.Name.GetType().Name);
A anotherA = new A();
anotherA.Name = "Another A";
setMethod(a, anotherA);
Console.WriteLine(a.Name.GetType().Name);
}
}
public class A
{
public string Name { get; set; }
}
public delegate void SetValue(object obj, object val);
}
Thật sự tôi đã được dự kiến loại kiểm tra khi giao đến A.Name một số giá trị, chứ không phải thông qua các tham số kiểu gõ. pi.SetValue (a, 123) sẽ gây ra ArgumentException với văn bản về lỗi chuyển đổi kiểu đối tượng, nhưng phương thức SetValue cũng chấp nhận các đối tượng làm tham số. –
Trên thực tế xảy ra thay đổi tham chiếu mà không cần kiểm tra loại ... –