C#, 利用dynamic宣告變數

利用dynamic宣告變數

  1. using System;
  2. class Program
  3. {
  4. static void Main()
  5. {
  6. // 宣告 dynamic 物件
  7. dynamic dynamicObject = new { Property1 = "Value1", Property2 = 42, Property3 = true };
  8. // 取得屬性值
  9. string value1 = dynamicObject.Property1;
  10. int value2 = dynamicObject.Property2;
  11. bool value3 = dynamicObject.Property3;
  12. // 顯示取得的值
  13. Console.WriteLine($"Property1: {value1}");
  14. Console.WriteLine($"Property2: {value2}");
  15. Console.WriteLine($"Property3: {value3}");
  16. }
  17. }

利用dynamic宣告空的變數, 動態指定屬性資料

  1. using System;
  2. class Program
  3. {
  4. static void Main()
  5. {
  6. // 宣告 dynamic 變數
  7. dynamic dynamicObject = new System.Dynamic.ExpandoObject();
  8. // 給動態變數不同的屬性名稱和值
  9. dynamicObject.Property1 = "Value1";
  10. dynamicObject.Property2 = 42;
  11. dynamicObject.Property3 = true;
  12. // 讀取動態變數的屬性
  13. string value1 = dynamicObject.Property1;
  14. int value2 = dynamicObject.Property2;
  15. bool value3 = dynamicObject.Property3;
  16. // 顯示讀取的值
  17. Console.WriteLine($"Property1: {value1}");
  18. Console.WriteLine($"Property2: {value2}");
  19. Console.WriteLine($"Property3: {value3}");
  20. }
  21. }

缺點 : 使用dynamic變數時, 打"點"之後不會自動顯示可用屬性, 需手動輸入屬性名稱


dynamic變數跨類別後, 就無法直接取得屬性值

(在偵錯模式雖然看得到值, 但讀取時會顯示無此屬性), 這時可以使用Reflection來取得屬性名稱。

  1. public static object GetDynamicValue(string PropertyName, dynamic dynData )
  2. {
  3. object o = null;
  4. Type type = dynData.GetType();
  5. //取得集合(List)內的型別
  6. PropertyInfo[] classProperties = type.GetProperties();
  7. foreach (PropertyInfo property in classProperties)
  8. {
  9. if (property.Name == PropertyName)
  10. {
  11. o = property.GetValue(dynData);
  12. break;
  13. }
  14. }
  15. return o;
  16. }
  17. public static Main()
  18. {
  19. dynamic obj = new { p1 = "123", p2 = 456};
  20. string p1Value = GetDynamicValue("p1", obj); //p1Value="123"
  21. }


也可以轉個彎, 先把dynamic object轉為JSon格式字串, 使用string方式傳到方法內, 再反轉回dynamic Object, 這時dynamic Object就可以直接使用屬性取得值

反序列化(JSON字串轉C# Class)

  1. using Newtonsoft.Json;
  2. class Program
  3. {
  4. static void Main()
  5. {
  6. string jsonString = @"
  7. [
  8. {""Name"":""John"",""Country"":""USA"",""Age"":25},
  9. {""Name"":""Alice"",""Country"":""Canada"",""Age"":30},
  10. {""Name"":""Bob"",""Country"":""UK"",""Age"":22}
  11. ]";
  12. // 反序列化為 List<MyClass>
  13. var myObjects = JsonConvert.DeserializeObject<List<MyClass>>(jsonString);
  14. // 輸出結果
  15. foreach (var obj in myObjects)
  16. {
  17. Console.WriteLine($"姓名: {obj.Name}, 國家: {obj.Country}, 年紀: {obj.Age}");
  18. }
  19. }
  20. }

序列化(C# Class轉JSON字串)

using Newtonsoft.Json;

class Program
{
    static void Main()
    {
        List<MyClass> myObjects = new List<MyClass>
        {
            new MyClass { Name = "John", Country = "USA", Age = 25 },
            new MyClass { Name = "Alice", Country = "Canada", Age = 30 },
            new MyClass { Name = "Bob", Country = "UK", Age = 22 }
        };

        // 序列化為 JSON 字符串
        string jsonString = JsonConvert.SerializeObject(myObjects, Formatting.Indented);

        // 輸出結果
        Console.WriteLine(jsonString);
    }
}

 

 

 

 

留言

這個網誌中的熱門文章

ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務

Oracle 工作排程 DBMS_JOB 筆記

Oracle 例外控制(Exception Control)