dynamic簡介 dynamic是.NET Framework4.0的新特性。dynamic的出現讓C#具有了弱語言類型的特性。編譯器在編譯的時候不再對類型進行檢查,編譯時預設dynamic對象支持你想要的任何特性。 dynamic簡化反射實現 使用dynamic來簡化反射實現是一種比較常見的編程 ...
dynamic簡介
dynamic是.NET Framework4.0的新特性。dynamic的出現讓C#具有了弱語言類型的特性。編譯器在編譯的時候不再對類型進行檢查,編譯時預設dynamic對象支持你想要的任何特性。
dynamic簡化反射實現
使用dynamic來簡化反射實現是一種比較常見的編程技巧,它可以減少代碼的複雜性並提高可讀性。下麵是一個使用dynamic來簡化反射實現的示例:
// 定義一個類
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
}
// 創建一個對象並設定屬性值
var person = new Person
{
Name = "劉備",
Age = 30,
Gender = "男"
};
// 使用反射獲取屬性值
var type = person.GetType();
var properties = type.GetProperties();
foreach (var property in properties)
{
var value = property.GetValue(person);
Console.WriteLine($"{property.Name}:{value}");
}
// 使用dynamic來簡化反射實現
dynamic dynamicPerson = person;
Console.WriteLine($"Name:{dynamicPerson.Name}, Age:{dynamicPerson.Age}, Gender:{dynamicPerson.Gender}");
//歡迎公眾號:DOTNET開發跳槽,領取海量面試題
可以看到,使用dynamic來簡化反射實現可以將代碼變得更加簡潔易讀,同時也可以避免一些繁瑣的反射操作。使用dynamic可能會帶來一些性能上的損失,應該根據具體情況進行選擇。具體會不會,下麵實驗一下。
dynamic與反射的性能對比
這裡首先新建一個類和一個兩數相加的方法,然後分別使用反射和dynamic來調用這個類的方法,並迴圈數次,來對比它們的性能。代碼如下:
#region 反射和dynamic的對比
int times = 1000000;
DynamicTest reflectTest = new DynamicTest();
var addMethod = typeof(DynamicTest).GetMethod("Add");
Stopwatch watchl = Stopwatch.StartNew();
for (var i = 0;i< times; i++)
{ addMethod.Invoke(reflectTest, new object[] { 1, 2 }); }
Console.WriteLine($"反射耗時:{watchl.ElapsedMilliseconds}毫秒");
dynamic dynamicTest = new DynamicTest();
Stopwatch watch2 = Stopwatch.StartNew();
for (int i =0;i< times; i++)
dynamicTest.Add(1,2);
Console.WriteLine($"dynamic耗時:{watch2.ElapsedMilliseconds} 毫秒");
#endregion
//測試的類
public class DynamicTest
{
public string Name{get; set; }
public int Add(int a, int b)
{
return a + b;
}
}
//歡迎公眾號:DOTNET開發跳槽,領取海量面試題
100萬次的效果:
1萬次的效果:
可見100萬次迴圈的效果dynamic要好點,1萬次反射耗時小於dynamic。為了效果,所以每一次實驗運行兩次。
結語
由上可以看出dynamic的確可以簡化反射,讓代碼更加簡潔,可讀性更強。但是從對比來看,dynamic在低數量調用的使用上性能要比反射弱太多,比較大的數量調用來說它們不相上下。建議如果你的代碼對性能要求不太高的情況下,可以使用dynamic來簡化反射。
參考:微軟官方文檔,《改善C#程式的157個建議》
來源公眾號:DotNet開發跳槽