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方法,执行失败

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

时间: 2024-10-04 00:15:48

C# 4 dynamic 动态对象 动态类型转换的相关文章

C# DynamicObject 动态对象

dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你对GetDynamicObject方法返回的对象一无所知,你也可以像如下那样进行代码的调用,编译器不会报错: dynamic dynamicObject = GetDynamicObject(); Console.WriteLine(dynamicObject.Name); Console.Writ

自定义动态对象

1,自定义动态对象需要继承DynamicObject类 2,可根据需要,重写不同的DynamicObject方法 -----------------------------------------------------DynamicClass.cs  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using S

动态对象DynamicObject实现让字典书写更优美

我想用过MVC的人都知道一件事,viewbag的值是存储在viewdata里面的. 先看以下组图: 看了上图是不是感觉很神奇,Dictionary<string, object>也可以这样使用~ 实现主要继承了DynamicObject 接下来直接贴代码: /// <summary> /// 动态对象 /// </summary> public class VarObject : DynamicObject { /// <summary> /// 数据字段

动态对象创建

C++的动态对象创建 对象创建 当创建一个C++对象时,会发生两件事: (1)为对象分配内存 (2)调用构造函数来初始化那个内存 然而,为对象分配内存可以用以下几种方式或在可选择的时间发生: (1)在静态存储区域,存储空间在程序开始之前就可以分配.这个存储空间在整个运行期间都存在. (2)无论何时到达一个特殊的执行点(左大括号)时,存储单元都可以在栈上被创建.出了执行点(右大括号),这个存储单元自动被释放.这些栈分配运算内置于处理器的指令集中,非常有效.但是,在写程序的时候,必须知道需要多少个存

Unity动态对象优化

对于静态对象,Unity可以使用通过勾选Static,然后让Unity自身进行优化Draw Calls,但是对于动态对象,Unity在这方面没有处理,这就需要我们自己去实现,实现的原理就是首先去遍历每个对象的SkinnderMeshRenderer,然后将其所有的动态对象组合成一个大的对象并且将骨骼动画赋值给他,这样,我们就实现了动态对象的优化,代码如下: public static void CombineToMesh(GameObject _go)     {         Skinned

动态对象创建(二)重载new和delete

前言 上文我简单介绍了一下动态对象创建的方法,这一篇文章的内容主要是对重载new和delete做一些讲解,也希望能够得到博友们的指点,在这里谢过大家. 通常我们为了一些目的而使用new和delete的内存分配系统,但是在特殊情况下,它并不能够满足需要.最常见的改变分配系统的原因是出于效率考虑:也许要创建和销毁一个特定的类的非常多的对象以至于这个运算变成了速度的瓶颈.C++允许重载new和delete来实现我们自己的存储分配方案,所以可以用它来处理问题. 另一个问题就是堆碎片:分配不同大小的内存可

搭建Dynamic Web Project(动态web项目)的springmvc工程2

本文转载自:http://blog.csdn.net/typa01_kk/article/details/45905129 此篇为“创建Dynamic Web Projec工程,”搭建Dynamic Web Project(动态web项目)的springmvc工程1的续篇,“搭建springmvc框架web项目”: 注:开发工具,以及jar包下载,404访问处理,请到上篇或下链接!!! 下载分享%springmvc开发分享****,(提取码:2c4a)也可网上下载,适合自己的或最新版本使用. 4

搭建Dynamic Web Project(动态web项目)的springmvc工程1

本文转载自:http://blog.csdn.net/typa01_kk/article/details/45902955 此篇创建Dynamic Web Projec工程(动态web项目),下一篇,搭建Dynamic Web Project(动态web项目)的springmvc工程2,搭建springmvc. 404错误解决可以查看:springmvc下404解决 工具: jdk:jdk-8u45-windows-x64.exe 服务器:apache-tomcat-8.0.22 eclipse

DMI(Dynamic Method Invocation) 动态方法调用

创建action,内容如下: package action; import com.opensymphony.xwork2.ActionSupport; public class A extends ActionSupport { public String toJsp(){ return "success"; } } 配置struts.xml,内容如下: <?xml version="1.0" encoding="UTF-8" ?>