后期再写写NetCoreWebApi方面的,今天换个"口味"
var和dynamic类型表面上非常相似,但是实际上是非常不同的:
-
var - 让编译器去确定类型;
-
dynamic - 让运行时确定类型;
例如:
dynamic x = "hello";
var y = "hello";
//这里编译器不会报错,程序运行报错
int i = x;
//这里编译器会报错
int j = y;
但是一个由var声明的变量的静态类型可以用dynamic:
dynamic x = "hello";
// 这里 y 会被认为是dynamic类型
var y = x;
// 运行时会出错
int z = y;
常见的应用场景:
-
在后台接收对象,如微信小程序授权参数传到我们后台,可以使用dynamic类型接收此参数,比较方便不用自己去做json对象处理:
[HttpPost]
public async Task<IActionResult>
DoLogin([FromBody]dynamic data){
// data为传过来的数据 这里做逻辑处理
}
2.快速创建一个临时对象,比如User类,里面有Name与Age属性,通常做法可能是创建类然后写属性,但是也可以试试下面的方式:
var UserA= new { Name = "Huang", Age = 18 };
Console.WriteLine($"Name is {UserA.Name},Age is {UserA.Age}");
dynamic userB = new ExpandoObject();
userB.Name = "Huang";
userB.Age = 18;
Console.WriteLine($"Name is {userB.Name},Age is {UserA.Age}");
ExpandoObject类实现了 IDictionary<string,object> 接口其实它里面就是用一个字典来存储动态赋值的数值的,键的类型为字符串,表示属性名;值的类型为object,表示任何类型;
3.反射的中用到dynamic也比较多,比如我们要调用下面类中方法:
namespace ClassLibrary
{
public class Demo
{
public string GetName()
{
String name = "dddd";
return name;
}
}
}
通常情况下调用:
static void Main(string[] args)
{
Type typeinfo = Assembly.Load("ClassLibrary").GetType("ClassLibrary.Demo");
object instance = Assembly.Load("ClassLibrary").CreateInstance("ClassLibrary.Demo");
MethodInfo me = typeinfo.GetMethod("GetName");
object ret = me.Invoke(instance, null);
Console.WriteLine(ret.ToString());
}
使用dynamic处理下调用:
class Program
{
static dynamic reflectObj = null;
static void Main(string[] args)
{
if (reflectObj == null)
{
reflectObj = Assembly.Load("ClassLibrary").CreateInstance("ClassLibrary.Demo");
}
object obj= reflectObj.GetName();
Console.WriteLine(obj.ToString());
Console.ReadKey();
}
}
但是dynamic也不完全是好的,通常运行时的绑定会对程序性能有些影响,如果编译时函数名称确定,对象类型在编译时也确定,那就既不需要反射也不需要dynamic。 喜欢就点个赞~
原文地址:https://mp.weixin.qq.com/s/JrRHw7zmMwddL1d0qMJmAA
关注公众号 发现更多资源