C#如何通过单一接口实例化不同实现类以统一调用方法
问题解决:CS0128 变量重复定义错误
错误原因
你在switch的每个case分支里用var声明myInterface,但C#中switch块属于同一个作用域,多个分支里的同名变量会触发重复定义错误。同时,分支内定义的变量作用域仅限当前case,switch外部无法访问,这也会导致后续调用myInterface.GetProperty时找不到变量。
正确实现方式
在switch外部先声明接口类型的变量,再在各个分支中为其赋值具体实现类的实例,既避免重复定义,又能保证后续代码通过接口统一调用方法:
// 先在switch外部声明接口类型变量 IinFileMetaHandler myInterface = null; switch(xInterface) { case "exiftool": myInterface = new InterfaceModule_exiftool(s_exifTool); break; case "openxml": myInterface = new InterfaceModule_openxml(); break; default: Logger.Error($"Error! No code module known to handle '{xInterface}'. Check XML" ); return 4; } // 确认实例化成功后调用方法 if (myInterface != null) { int rc = myInterface.GetProperty(pFileName, xtargetAttribute, propertyValue, fileType); Console.WriteLine($" ===> propertyValue= {propertyValue} "); }
额外优化建议
- 可以用工厂模式封装实例化逻辑,把switch判断抽离到单独的工厂类中,后续新增文件类型实现时,只需修改工厂类,业务代码无需变动,更符合开闭原则。
- 注意接口方法的
propertyValue参数:如果需要从方法内部输出值,建议改为out string propertyValue或ref string propertyValue,否则当前代码中对该参数的赋值无法传递到外部(取决于你的实际实现逻辑)。
内容的提问来源于stack exchange,提问作者jc508
相关产品推荐
相关产品推荐

