在C#中是否存在Python的ImportError等价物

时间:2015-10-03 09:03:55

标签: c# python

我正在为Unity3d提供各种常见模式的代码库。它将作为源代码而不是已编译的DLL导入到项目中。

某些代码只应在存在特定依赖项(也作为源代码安装)的情况下进行编译。 (在这种情况下,只有在项目中安装了Photon时才能编译网络代码)。

我可以通过手动删除不需要的文件,但我更喜欢某种自动方式来有条件地编译类。

如果这是Python我可以做的事情:

try:
    import MyLibrary

    class MyClass(self):
        ...

except ImportError:
    # library not imported

我知道在一个类中我可以使用反射来确定是否定义了类,但有没有办法在更高级别执行此操作,即使用伪代码:

#if namespace_defined('ExternalDependency') // <-- how can I do this kind of check?
using ExternalDependency;

public class MyClass { ... } 
#endif

1 个答案:

答案 0 :(得分:1)

在C#中,您不可能在代码文件中包含 <p>To register with the library, please <i>click</i> the button below:</p> <c:url value="/registerPerson/register" var="registerURL" /> <form:form action="${registerURL}" method="get"> <input type="submit" value="Register"> </form:form> 子句作为项目的一部分,该项目不引用包含导入的命名空间的程序集,因此,你无法进​​行检查。

命名空间的private RegisterPersonValidator registerPersonValidator; private PersonService personService; @Autowired public RegisterPersonController(RegisterPersonValidator registerPersonValidator, PersonService personService) { this.registerPersonValidator = registerPersonValidator; this.personService = personService; } @RequestMapping(value = "/register", method = RequestMethod.GET) public String getRegisterPerson(Model model) { Person person = new Person(); model.addAttribute("person", person); return "registerPerson"; } @RequestMapping(method = RequestMethod.POST, value = "/register") public String postRegisterPerson(@ModelAttribute("person") Person person, BindingResult bindingResult, SessionStatus sessionStatus, Model model) { System.out.println(person.toString()); registerPersonValidator.validate(person, bindingResult); if (bindingResult.hasErrors()) { return "registerPerson"; } else { int id = personService.insert(person); sessionStatus.setComplete(); return "personOptions/id/" + id; } } 不能位于任何引用的程序集中会产生编译器错误(即您是否缺少项目引用?)。

换句话说,C#鼓励开发人员确保所有依赖项在编译时都可用。

实际上,如果您想根据某些配置,环境或其他方式在代码中执行不同的操作,您似乎需要坚持inversion of control design pattern