110,499
社区成员
发帖
与我相关
我的任务
分享
public class MyTestClass
{
private string _name;
public string Name
{
get
{
return string.Format("名字:{0}", _name);
}
set
{
value = value ?? string.Empty;
_name = value.Substring(0, 4);
}
}
}
public static void Main()
{
DynamicMethod method = new DynamicMethod("Set_Name", typeof(string), new Type[] { typeof(object), typeof(object) });
var il = method.GetILGenerator();
il.Emit(OpCodes.Ldarg, 0);
il.Emit(OpCodes.Ldarg, 1);
//do something
var name = typeof(MyTestClass).GetProperty("Name");
name.SetMethod = method;//setmethod只读
}
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Linq;
using Emit;
using System.Diagnostics;
using System.Collections.Generic;
using System.Collections;
public class MyTestClass
{
private string _name;
public virtual string Name
{
get
{
return string.Format("名字:{0}", _name);
}
set
{
value = value ?? string.Empty;
_name = value.Substring(0, 4);
}
}
}
class DynamicJumpTableDemo
{
public static void Main()
{
var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("myAss"), AssemblyBuilderAccess.RunAndSave);
var module = assembly.DefineDynamicModule("myModule", "myModule.dll");
var myClass = module.DefineType("MyTestClass2", TypeAttributes.Public, typeof(MyTestClass));
var method = myClass.DefineMethod("setvalue", MethodAttributes.Public | MethodAttributes.Virtual, null, new Type[] { typeof(string) });
var ilm = method.GetILGenerator();
var field = myClass.DefineField("_name", typeof(string), FieldAttributes.Private);
//这个不能用
//var field = myClass.BaseType.GetField("_name", BindingFlags.NonPublic | BindingFlags.Instance);
ilm.Emit(OpCodes.Ldarg, 0);
ilm.Emit(OpCodes.Ldarg, 1);
ilm.Emit(OpCodes.Stfld, field);
ilm.Emit(OpCodes.Ret);
myClass.DefineMethodOverride(method, typeof(MyTestClass).GetProperty("Name").GetSetMethod());
var obj = myClass.CreateType().GetConstructor(new Type[0]).Invoke(null);
var name = obj.GetType().GetProperty("Name");
name.SetValue(obj, "888888888888888");
}
}
我在子类重写了父类中的name的setvalue方法。。问题出现在
var field = myClass.DefineField("_name", typeof(string), FieldAttributes.Private);
//这个不能用
//var field = myClass.BaseType.GetField("_name", BindingFlags.NonPublic | BindingFlags.Instance);
ilm.Emit(OpCodes.Ldarg, 0);
ilm.Emit(OpCodes.Ldarg, 1);
ilm.Emit(OpCodes.Stfld, field);
ilm.Emit(OpCodes.Ret);
我不能给MyTestClass的_name字段赋值。。这是为什么?不能对父类的属性进行操作吗?只能自己另外建1个吗?
var c = new ServiceContainer();
c.Register<MyTestClass>();
c.Intercept(mi => mi.IsPropertyGetter(), ii => "Hello");
var m = c.GetInstance<MyTestClass>();
Console.WriteLine(m.Name);
private string _name;
public string Name
{
private get
{
return string.Format("名字:{0}", _name);
}
set
{
_name = value;
}
}
[/quote]
不是。。我是想让我的Name的get执行我特定的代码。。而些特定的代码是在程序运行时动态添加的
private string _name;
public string Name
{
private get
{
return string.Format("名字:{0}", _name);
}
set
{
_name = value;
}
}
public class MyTestClass
{
private string _name;
public virtual string Name
{
get
{
return string.Format("名字:{0}", _name);
}
set
{
value = value ?? string.Empty;
_name = value.Substring(0, 4);
}
}
}
public static void Main()
{
var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("myAss"), AssemblyBuilderAccess.RunAndSave);
var module = assembly.DefineDynamicModule("myModule", "myModule.dll");
var myClass = module.DefineType("MyTestClass2", TypeAttributes.Public, typeof(MyTestClass));
var property_Name = myClass.DefineProperty("Name", PropertyAttributes.None, typeof(string), null);
var type = myClass.CreateType();//报错。。MyTestClass访问被拒绝
object obj = type.GetConstructor(new Type[0]).Invoke(null);
}
报错了- -。。是不是没在同一程序集。。如何改。。