User Tools

Site Tools


note:prog:csharp:250731:001:index

C#: ReadValueFromFileXxx 合併成一支泛型方法 (2025-07-31)

  • 把所有的 ReadValueFromFileXxx 合併成一支泛型方法,只要一行就能從 “Key:Value” 這種格式裡取出任何基本型別(int、uint、float、ulong、string…)的值:
  • /// <summary>
    /// 通用版:從 "Key:Value" 這種字串中解析出 Value,並轉成 T 回傳。
    /// </summary>
    /// <typeparam name="T">
    /// 目標型別,只要能用 Convert.ChangeType 轉換就行(數值、string…)
    /// </typeparam>
    /// <param name="line">形如 "SomeKey:123.45" 或 "Foo:ABC" 的字串</param>
    private T ReadValueFromFile<T>(string line)
    {
        // 1) 切兩段
        var parts = line.Split(':', 2);
        if (parts.Length < 2)
            throw new FormatException($"無法解析 '{line}',必須包含 ':'");
    
        string valStr = parts[1];
    
        // 2) 如果是字串,就直接回傳
        if (typeof(T) == typeof(string))
            return (T)(object)valStr;
    
        // 3) 其他型別交給 Convert.ChangeType
        return (T)Convert.ChangeType(valStr, typeof(T));
    }
    

使用範例

  • UInt16 u16 = ReadValueFromFile<UInt16>("ParamA:65535");
    int    i32 = ReadValueFromFile<int>(     "ParamB:-12345");
    float  f   = ReadValueFromFile<float>(   "ParamC:3.14159");
    ulong  u64 = ReadValueFromFile<ulong>(   "ParamD:9876543210");
    string s   = ReadValueFromFile<string>(  "ParamE:Hello!");
    
  • 這樣一來,以後要支援新的型別(例如 double、short…)都不用多寫一個函式,只要呼叫同一支 ReadValueFromFile<T> 即可。

原始 Code

  •         private UInt16 ReadValueFromFileUint16(String para_line)
            {
                string[] astringee = null;
                UInt16 i;
    
                astringee = para_line.Split(':');
                i = Convert.ToUInt16(astringee[1]);
                return i;
            }
    
            private Single ReadValueFromFileSingle(String para_line)
            {
                string[] astringee = null;
                Single i;
    
                astringee = para_line.Split(':');
                i = Convert.ToSingle(astringee[1]);
                return i;
            }
    
            private ulong ReadValueFromFileUint64(String para_line)
            {
                string[] astringee = null;
                UInt64 i;
    
                astringee = para_line.Split(':');
                i = Convert.ToUInt64(astringee[1]);
                return (ulong)i;
            }
    
            private long ReadValueFromFileInt64(String para_line)
            {
                string[] astringee = null;
                Int64 i;
    
                astringee = para_line.Split(':');
                i = Convert.ToInt64(astringee[1]);
                return (long)i;
            }
    
            private int ReadValueFromFileInt32(String para_line)
            {
                Int32 _outValue;
                string[] astringee = null;
    
                astringee = para_line.Split(':');
                _outValue = Convert.ToInt32(astringee[1]);
    
                return (int)(_outValue);
            }
    
            private UInt32 ReadValueFromFileUint32(String para_line)
            {
                UInt32 _outValue;
                string[] astringee = null;
    
                astringee = para_line.Split(':');
                _outValue = Convert.ToUInt32(astringee[1]);
    
                return (uint)_outValue;
            }
    
            private Int16 ReadValueFromFileInt16(String para_line)
            {
                Int16 _outValue;
                string[] astringee = null;
    
                astringee = para_line.Split(':');
                _outValue = Convert.ToInt16(astringee[1]);
    
                return _outValue;
            }
    
            private float ReadValueFromFileFloat(String para_line)
            {
                Double _outValue;
                string[] astringee = null;
    
                astringee = para_line.Split(':');
                _outValue = Convert.ToDouble(astringee[1]);
    
                return (float)_outValue;
            }
    
            private byte ReadValueFromFileByte(String para_line)
            {
                byte _outValue;
                string[] astringee = null;
    
                astringee = para_line.Split(':');
                _outValue = Convert.ToByte(astringee[1]);
    
                return _outValue;
            }
    
            private String ReadValueFromFileString(String para_line)
            {
                String _outValue;
                string[] astringee = null;
    
                astringee = para_line.Split(':');
                _outValue = astringee[1];
    
                return _outValue;
            }

TAGS

  • 2 person(s) visited this page until now.

note/prog/csharp/250731/001/index.txt · Last modified: 2025/07/31 15:06 by jethro