using
System;
using
System.Linq;
using
System.Reflection;
using
System.Reflection.Emit;
public
sealed
class
DynamicProxy
{
private
static
readonly
string
AssemblyName =
"
DynamicProxy
"
,
ModuleName
=
"
DynamicProxy
"
,
TypeName
=
"
DynamicProxy
"
;
private
AssemblyBuilder CreateDynamicAssembly<T>()
where
T :
class
{
return
AppDomain.CurrentDomain.DefineDynamicAssembly(
new
AssemblyName(AssemblyName +
typeof
(T).Name),
AssemblyBuilderAccess.Run);
}
private
ModuleBuilder CreateDynamicModule<T>()
where
T :
class
{
return
CreateDynamicAssembly<T>().DefineDynamicModule(ModuleName +
typeof
(T).Name);
}
///
<summary>
///
創建動態代理
///
</summary>
public
T CreateDynamicType<T>()
where
T :
class
,
new
()
{
TypeBuilder typeBuilder
= CreateDynamicModule<T>().DefineType(TypeName +
typeof
(T).Name, TypeAttributes.Public |
TypeAttributes.Class,
typeof
(T));
TypeActuator
<T>
(typeBuilder);
return
Activator.CreateInstance(typeBuilder.CreateType())
as
T;
}
private
void
BuildCtorMethod(Type classType, FieldBuilder fieldBuilder, TypeBuilder typeBuilder)
{
var
structureBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard,
null
);
var
ilCtor =
structureBuilder.GetILGenerator();
ilCtor.Emit(OpCodes.Ldarg_0);
ilCtor.Emit(OpCodes.Newobj, classType.GetConstructor(Type.EmptyTypes));
ilCtor.Emit(OpCodes.Stfld, fieldBuilder);
ilCtor.Emit(OpCodes.Ret);
}
private
void
BuildMethod(ILGenerator il, MethodInfo methodInfo, Type[] ParameterTypes)
{
il.Emit(OpCodes.Ldarg_0);
for
(
int
i =
0
; i < ParameterTypes.Length; i++
)
il.Emit(OpCodes.Ldarg_S, (
short
)(i +
1
));
il.Emit(OpCodes.Call, methodInfo);
il.Emit(OpCodes.Ret);
}
private
void
TypeActuator<T>(TypeBuilder builder)
where
T :
class
{
FieldBuilder fieldBuilder
= builder.DefineField(
"
_DynamicProxyActuator
"
,
typeof
(T), FieldAttributes.Private);
BuildCtorMethod(
typeof
(T), fieldBuilder, builder);
MethodInfo[] info
= GetMethodInfo(
typeof
(T));
foreach
(MethodInfo methodInfo
in
info)
{
if
(!methodInfo.IsVirtual && !methodInfo.IsAbstract)
continue
;
if
(methodInfo.Name ==
"
ToString
"
)
continue
;
if
(methodInfo.Name ==
"
GetHashCode
"
)
continue
;
if
(methodInfo.Name ==
"
Equals
"
)
continue
;
var
ParameterTypes = methodInfo.GetParameters().Select(p =>
p.ParameterType).ToArray();
MethodBuilder methodBuilder
= CreateMethod(builder, methodInfo.Name, MethodAttributes.Public |
MethodAttributes.Virtual,
CallingConventions.Standard, methodInfo.ReturnType, ParameterTypes);
var
ilMethod =
methodBuilder.GetILGenerator();
BuildMethod(ilMethod, methodInfo, ParameterTypes);
}
}
private
MethodBuilder CreateMethod(TypeBuilder typeBuilder,
string
name, MethodAttributes attrs, CallingConventions callingConventions,
Type type, Type[] parameterTypes)
{
return
typeBuilder.DefineMethod(name, attrs, callingConventions, type, parameterTypes);
}
private
MethodInfo[] GetMethodInfo(Type type)
{
return
type.GetMethods(BindingFlags.Public |
BindingFlags.Instance);
}
}
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

