C#如何直接传递类类型作为方法参数,避免实例化开销
你当前的写法逻辑不可用:Type类型没有实现IMyBaseType接口,new SomeDataItem().GetType() as IMyBaseType会直接返回null,既无法满足原有方法的参数要求,也达不到按类型搜索的目的。可以选择以下任意一种方案实现需求:
方案1:新增Type参数的重载方法
直接重载GetItemPosition,新增接收Type类型参数的版本,内部做类型合法性校验后直接执行搜索逻辑:
// 新增重载 public (bool, Point) GetItemPosition(Type targetType) { // 运行时校验类型是否满足接口约束 if (!typeof(IMyBaseType).IsAssignableFrom(targetType)) { throw new ArgumentException("传入类型必须实现IMyBaseType接口", nameof(targetType)); } // 原有搜索逻辑调整为直接和targetType比对即可 // 例:原有逻辑是 if(item.GetType() == inputInstance.GetType()) 改为 if(item.GetType() == targetType) ... }
调用时直接传入类型的Type对象,无需实例化:
public bool AddTarget() { var (hasTarget, location) = GetItemPosition(typeof(SomeDataItem)); ... }
方案2:抽离公共逻辑避免代码重复
如果不想改动原有方法的逻辑,可以把搜索核心逻辑抽离为私有公共方法,两个重载共用同一份逻辑:
// 原有公开方法保持兼容 public (bool,Point) GetItemPosition(IMyBaseType instance) { return SearchCore(instance.GetType()); } // 新增Type参数重载 public (bool,Point) GetItemPosition(Type targetType) { if (!typeof(IMyBaseType).IsAssignableFrom(targetType)) throw new ArgumentException("类型不满足约束", nameof(targetType)); return SearchCore(targetType); } // 核心搜索逻辑 private (bool,Point) SearchCore(Type targetType) { // 所有搜索逻辑写在这里 ... }
方案3:泛型版本(编译期类型安全)
如果想要编译期就校验类型约束,避免运行时报错,可以用泛型实现:
// 泛型版本,编译期自动校验T是否实现IMyBaseType public (bool, Point) GetItemPosition<T>() where T : IMyBaseType { var targetType = typeof(T); // 执行搜索逻辑 ... }
调用方式更简洁:
public bool AddTarget() { var (hasTarget, location) = GetItemPosition<SomeDataItem>(); ... }
内容的提问来源于stack exchange,提问作者Matt W
相关产品推荐
相关产品推荐

