我正在为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
答案 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。