Может кто-нибудь объяснить или указать объяснение, почему проверка типов выполнения не происходит в примере ниже - свойство string может быть установлено на любое значение типа ...
Застрял с этим в очень неожиданном месте и был очень удивленDynamicMethod и проверки типов
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);
}
На самом деле я был ожидаемый тип проверки при назначении a.name какое-то значение, а не с помощью параметров метода ввода. pi.SetValue (a, 123) вызовет ArgumentException с текстом об ошибке преобразования типа объекта, но метод SetValue также принимает объекты как параметры. –
Фактически происходит смена ссылки без проверки типов ... –