C#如何编写可接收不同类对象的通用静态方法MethodABC
解决方案:创建可接收不同类对象的C#静态方法
嘿,我来帮你搞定这个需求!你想要一个能接收A、B、C类对象的静态方法MethodABC,并且根据传入的对象类型执行对应操作对吧?这里有几种实用的方案,你可以根据自己的场景来选:
方案1:使用C#模式匹配(推荐,C# 7.0+)
这是现在最简洁优雅的写法,利用C#的模式匹配特性,直接在switch语句中匹配对象类型,代码可读性拉满:
// 先定义你的三个类 public class A { public string name { get; set; } } public class B { public int age { get; set; } } public class C { public decimal salary { get; set; } } // 实现MethodABC方法 public static void MethodABC(object obj) { switch (obj) { case A aObj: // 处理A类型对象的逻辑,比如访问name属性 Console.WriteLine($"处理A类对象:name = {aObj.name}"); break; case B bObj: // 处理B类型对象的逻辑,比如访问age属性 Console.WriteLine($"处理B类对象:age = {bObj.age}"); break; case C cObj: // 处理C类型对象的逻辑,比如访问salary属性 Console.WriteLine($"处理C类对象:salary = {cObj.salary:C}"); break; default: // 处理未知类型的情况,避免程序出错 throw new ArgumentException("不支持的对象类型", nameof(obj)); } }
你的调用代码完全不用改,Function1、Function2、Function3可以直接正常调用这个方法。
方案2:typeof判断+类型转换(兼容老版本C#)
如果你的项目还在使用C# 7.0之前的版本,这种写法兼容性更好,逻辑也很清晰:
public static void MethodABC(object obj) { if (obj is A aObj) { Console.WriteLine($"处理A类对象:name = {aObj.name}"); } else if (obj is B bObj) { Console.WriteLine($"处理B类对象:age = {bObj.age}"); } else if (obj is C cObj) { Console.WriteLine($"处理C类对象:salary = {cObj.salary:C}"); } else { throw new ArgumentException("不支持的对象类型", nameof(obj)); } }
要是你习惯用typeof判断,也可以写成这样:
public static void MethodABC(object obj) { if (obj.GetType() == typeof(A)) { A aObj = (A)obj; Console.WriteLine($"处理A类对象:name = {aObj.name}"); } else if (obj.GetType() == typeof(B)) { B bObj = (B)obj; Console.WriteLine($"处理B类对象:age = {bObj.age}"); } else if (obj.GetType() == typeof(C)) { C cObj = (C)obj; Console.WriteLine($"处理C类对象:salary = {cObj.salary:C}"); } else { throw new ArgumentException("不支持的对象类型", nameof(obj)); } }
方案3:利用多态(面向对象最佳实践)
如果你的场景允许修改A、B、C这三个类的定义,那推荐用这种方式,符合面向对象的设计原则,后期维护更方便:
首先定义一个共同的接口,让三个类都实现它:
// 定义处理接口 public interface IProcessable { void Process(); } // 修改A类实现接口 public class A : IProcessable { public string name { get; set; } public void Process() { Console.WriteLine($"处理A类对象:name = {name}"); } } // 修改B类实现接口 public class B : IProcessable { public int age { get; set; } public void Process() { Console.WriteLine($"处理B类对象:age = {age}"); } } // 修改C类实现接口 public class C : IProcessable { public decimal salary { get; set; } public void Process() { Console.WriteLine($"处理C类对象:salary = {salary:C}"); } }
然后MethodABC就可以简化成这样,完全不用判断类型:
public static void MethodABC(IProcessable obj) { obj.Process(); }
这种方式把具体的处理逻辑放到了各个类内部,符合单一职责原则,以后如果要加新的类,只需要让新类实现IProcessable接口就行,不用修改MethodABC的代码。
内容的提问来源于stack exchange,提问作者Sagar
相关产品推荐
相关产品推荐

