反射雖能實現動態配置、延遲綁定,但繞過編譯期型別檢查,參數/回傳值皆為 object,極易在執行期發生型別錯誤。大多數情況下,介面、委派、類別工廠等強型別方案更簡潔、可維護。
// 反射版:脆弱、依賴無參建構函式、編譯期不報錯
Type t = typeof(MyType);
MyType obj = (MyType)t.GetConstructor(Type.EmptyTypes).Invoke(null);
// 工廠版:強型別、編譯期檢查、可標記屬性供發現
public static MyType CreateInstance() => new MyType();
// 反射版:參數檢查繁瑣、字串名稱易拼錯
object.InvokeMethod(obj, "MyHelperFunc");
// 介面版:編譯期綁定、智慧提示、重構安全
IMyInterface foo = obj as IMyInterface;
foo?.DoWork();
// 反射版
object val = obj.GetType().GetField("MyField").GetValue(obj);
// 介面版
foo.Msg = "work is done.";
若必須用反射,請自訂屬性(Attribute)標記目標型別/成員,搭配 AttributeUsage 限制適用範圍,大幅降低誤用風險(詳見原則 42)。
能用介面/工廠/委派解決的,堅決不用反射。反射保留給真正需要動態發現、跨組件擴展的框架級場景。