如何使用,而不是功能Delegate.CreateDelegate定义一个委托<>

如何使用,而不是功能Delegate.CreateDelegate定义一个委托<>,第1张

首先来看看一般的委托定义方法。
public delegate string MyDelegate(string message);
MSDN定义,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。
但是委托的本质是一个由系统自动生成的类,我们首先看看IL里面的MyDelegate的结构
可以看到实际上MyDelegate是继承自MulticastDelegate的类
MSIL表示方式如下:
class public auto ansi sealed EmitDemoDelegateDemoMyDelegate
extends [mscorlib]SystemMulticastDelegate
{
} // end of class EmitDemoDelegateDemoMyDelegate
method public hidebysig specialname rtspecialname
instance void ctor(object 'object',
native int 'method') runtime managed
{
} // end of method MyDelegate::ctor
method public hidebysig newslot virtual
instance string Invoke(string message) runtime managed
{
} // end of method MyDelegate::Invoke

不考虑异步调用,实际的类大概是这样的表示形式,但是C#并不允许直接继承MulticastDelegate,所以编译是无法通过的。
public class MyDelegate:MulticastDelegate
{
public MyDelegate(object target,IntPtr method)
:base(target,method)
{

}
public override string Invoke(string message){}
}
接下来仿照这个定义来实现委托类
首先是moduleBuilder 经常使用Emit的应该很熟悉了
string name = "MyDelegateDemo";
string fileName = name + "dll";
var assemblyName = new AssemblyName(name);
var assemblyBuilder = AppDomainCurrentDomainDefineDynamicAssembly(assemblyName,
AssemblyBuilderAccessRunAndSave);
var moduleBuilder = assemblyBuilderDefineDynamicModule(name, fileName);
接下来是定义类,要点是修饰参数要一致,基类是MulticastDelegate
//public auto ansi sealed
var delegateBuilder = moduleBuilderDefineType("MyDelegate",
TypeAttributesPublic | TypeAttributesAutoLayout | TypeAttributesAnsiClass |
TypeAttributesSealed, typeof(MulticastDelegate));
在设置构造函数,修饰参数也要一致,函数参数为object和IntPtr
最重要的是最后一句设置方法实现标志为runtime
// method public hidebysig specialname rtspecialname
// instance void ctor(object 'object',
// native int 'method') runtime managed
//{
//} // end of method MyDelegate::ctor
var constructorBuilder = delegateBuilderDefineConstructor(
MethodAttributesPublic | MethodAttributesHideBySig | MethodAttributesSpecialName |
MethodAttributesRTSpecialName,
CallingConventionsStandard, new[] { typeof(object), typeof(IntPtr) }
);
constructorBuilderSetImplementationFlags(MethodImplAttributesRuntime);
然后是定义方法Invoke,这里定义的返回值和参数都是string 可以根据需要调整。
同样修饰要一致,最后也要设置方法实现标志为Runtime
// method public hidebysig newslot virtual
// instance string Invoke(string message) runtime managed
//{
//} // end of method MyDelegate::Invoke
var resultType = typeof(string);
var paramTypes = new[] { typeof(string) };
var methodBuilder = delegateBuilderDefineMethod("Invoke",
MethodAttributesPublic | MethodAttributesHideBySig | MethodAttributesNewSlot |
MethodAttributesVirtual,
CallingConventionsStandard, resultType, paramTypes);
methodBuilderSetImplementationFlags(MethodImplAttributesRuntime);

最后创建类型,好了,定义完成了。
var delegateType = delegateBuilderCreateType();
接下来就需要调用测试一下了。
注意不能用ActivatorCreateInstance()来初始化代理而是DelegateCreateDelegate。
public class MyClass
{
public string MyMethod(string message)
{
ConsoleWriteLine(message);
return message;
}
}

调用
MyClass myClass = new MyClass();
var myDelegate = DelegateCreateDelegate(delegateType, myClass, "MyMethod");
myDelegateDynamicInvoke("Hello World!");
结果 Hello World!
OK 成功了。

线程的构造函数有Thread(ThreadStart) 和Thread(ParameterizedThreadStart) ,也就是说只支持这两种委托:public delegate void ThreadStart()和public delegate void ParameterizedThreadStart(Object obj)。
对应的方法也就只能是类似的格式,
如public void Haha()之类的。
Thread th = new Thread(Haha);
thstart();

委托人和被委托人的区别可以从定义、各自承担的责任两方面加以区分。

定义

委托人: 是指委托他人为自己办理事务的人。

被委托人: 是指接受委托人的委托代理委托人从事民事、商事活动或者诉讼、仲裁活动的人。

2委托人和被委托人的责任

委托人承担责任如下:

(一)明确委托事项。将委托事项明确告之被委托人,并提出具体要求,用语应简明易懂,防止使用含糊不清、模棱两可的语言。

(二)交付约定费用。为了使被委托人顺利处理其委托的事务,有时需要用一定数额的费用,委托人应按约定及时予以支付。支付的方式由双方商定,即可以预付,也可偿还。对于被委托人为处理约定事务而自己垫付的费用,委托人有不可抗辨支付义务。

(三)清偿债务。如果委托人超越授权范围对事务进行处理。委托人对此没有明确反对,依《民法通则》有关规定,视为委托人同意,故委托人对被委托人在此期间所负的债务,同样负有清偿义务。

(四)给付报酬。委托人在被委托人完成其委托事务后,应按合同的约定向被委托人如数支付报酬。

(五)赔偿责任。被委托人在处理事务过程中,用不可归责于自己的事由而造成损失的,有权要求委托人赔偿损失。

被委托人承担的责任如下:

(一)按照委托人的指令处理有关事务。被委托人不得违背委托人的指令,因为被委托人按指令所得理的事务是委托人的事务,不得在授权范围以外从事有关活动。

(二)对委托事务要亲自处理。被委托人接受委托人指令后应亲自处理委托事务,不得将受托的事务转托第三人处理。如遇必须要转托第三人办理的,应事先征得委托人同意,否则后果自负。

(三)及时向委托人报告事务处理情况。被委托人应及时向委托人报告事务处理的进展情况及有关问题,以使委托人及时了解和掌握完成事务的进度。事务全部办结合,应尽快向委托人报告处理事务的结果。

(四)交付财务和转移在以利。被委托人在处理委托人交办的事务过程中所收到的物品、孳息及其他财产,应当及时交还给委托人,不得随意转移、扣压、变卖有关物品,否则依法承担责任。

(五)造成损失应予以赔偿。被委托人因自己的过失,造成违约或产生违法行为而给委托人造成损失的,应依法赔偿损失或承担违约及法律责任。

委托人与被委托人的法律关系:依据委托协议而定,只要符合法律规定的范围内,被委托人在委托人授权的权限内从事的民事、商事法律行为对委托人生效。

委托的定义:

委托是基于行为人的某种法律目的和权利自由处分条件,通过契约授予受托人“处理事务”。

这里的事务,做广义理解,包括如下事务:

(一)受托人以自己名义代委托人处理买卖、租赁、借贷、保险等事务;

(二)委托他人以受托人名义管理财产、委托技术开发、提供媒介服务等事务;

(三)受托人以委托人名义代理处理委托人事务。

相关案例:

方某通过中介公司居间介绍看中本市某处房屋,该房屋是公有住房,中介公司称该房屋的承租人陈某已与中介签订《委托协议书》,委托中介公司出售该房屋并代办房产证。

随后中介公司向方某出示了陈某交给中介公司的自己的身份z、图章等证件,以陈某的名义与方某签订《房屋定购协议书》,总价为55万元。当日,方某支付给中介公司定金5万元。

此后,中介公司告知陈某不愿出售该房屋,只能退回其定金5万元。方某认为陈某与中介公司之间存在委托代理关系,双方签订的《房屋定购协议书》合法有效,应再赔偿自己5万元。但陈某认为其并未与方某订立《房屋定购协议书》,该协议书上的签名不是自己本人所写,该协议书应属无效。

无奈之下,方某起诉到法院,要求陈某按定金罚则赔偿5万元。

参考资料:

被委托人-百度百科

委托人-百度百科

中国民商法律网-委托行为的性质与法律调整

委托加工指受托加工货物,即委托方提供原料及主要材料,受托方按照委托方的要求,制造货物并收取加工费的业务。“加工”是指受托加工货物所发生的劳务,即委托方提供原料及主要材料,受托方按照委托方要求制造货物并收取加工费的劳务活动。如受托方提供主要原材料,该项交易不符合委托加工,其实质为生产产品过程,没有发生加工劳务,属于销售货物行为,因此,不能分别开具加工和销售材料发票。

提示:《增值税暂行条例实施细则释义》规定,条例所规定的“加工”是指受托加工货物所发生的劳务,即委托方提供原料及主要材料,受托方按照委托方要求制造货物并收取加工费的劳务活动。

include#include#defineMAX100structaddr{charname[30];charstreet[40];charcity[20];charstate[3];unsignedlongintzip;}addr_list[MAX];voidinit_list(void);intmenu_select(void);voidenter(void);intfind_free(void);voiddeleted(void);voidlist(void);intmain(void){charchoice;init_list();/initializethestructurearray/for(;;){choice=menu_select();switch(choice){case1:enter();break;case2:deleted();break;case3:list();break;case4:exit(0);}}return0;}/initializethelist/voidinit_list(void){registerintt;for(t=0;t4);returnc;}/Inputaddressintothelist/voidenter(void){intslot;chars[80];slot=find_free();if(slot==-1)

只要受托人是在委托权限范围内、以委托人的名义实施的行为,应由委托人承担一切责任、享有一切权利。作为受托人,不承担什么责任。
如受托人有实施委托行为时有故意或重大过失时,委托人在承担一切责任后,才可以向受托人追究责任。
委托配送是指连锁商店不设自身所有的配送中心,而是将商店的配送业务委托或外包给其他专业化物流配。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12613463.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存