C# 4 dynamic 动态对象 动态类型转换

public class User
        {
//使用省缺参数,一般不需要再为多态做各种静态重载了
public User( string name = "anonym", string type = "user" )
                {
this.UserName = name;
this.UserType = type;
                 }
public UserName { private set; get; }
public UserType { private set; get; }
        }

User user = new User();  //不带任何参数实例化
Console.WriteLine( user.UserName );  //输出 anonym
Console.WriteLine( user.UserType );    //输出 user

// dynamic 关键字可以绕过静态语言的强类型检查
dynamic d = user;
Console.WriteLine( d.UserName );      //输出 anonym
Console.WriteLine( d.UserType );        //输出 user

// ExpandoObject 是一个特殊对象,包含运行时可动态添加或移除的成员
dynamic eo = new System.Dynamic.ExpandoObject();
        eo.Description = "this is a dynamic property";
Console.WriteLine( eo.Description );    // 输出 this is a dynamic property

//继承 DynamicObject 类,重写 TryInvokeMember 虚拟方法
public class Animal : DynamicObject
        {
//尝试执行成员,成功返回 true,并从第二个参数输出执行后的返回值
public override bool TryInvokeMember( InvokeMemberBinder binder, 
object[] args, out object result)
               {
bool success = base.TryInvokeMember( binder, args, out result);
//基类尝试执行方法,返回 false,表示方法不存在,out 输出 null 值
//if (! success)  result = null;
//若返回 false 将抛出异常
return true;
               }
        }

//派生动态类
public class Duck : Animal
        {
public string Quack()
              {
return "Quack!!";
              }
        }

//派生动态类
public class Human : Animal
        {
public string Talk()
              {
return "Talk!!";
              }
         }

//调用动态方法
public static string DoQuack( dynamic animal )
        {
string result = animal.Quack();
return result ?? "Null";  //(result == null)? "Human" : result;
         }

var duck = new Duck();
var human = new Human();
Console.WriteLine( DoQuack( duck ) );      //输出 Quack
Console.WriteLine( DoQuack( human ) );   //输出 Null , Human类不包含Quack方法,执行失败

转载于:https://www.cnblogs.com/qizhinan/p/4047585.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值