【发布时间】:2012-07-13 09:45:29
【问题描述】:
我有以下类层次结构。
public abstract class ResourceBase { }
public abstract class WebResourceBase : ResourceBase {
public ResourceBase LocalPath { get; set; }
public ResourceBase FtpPath { get; set; }
}
public class JavaScript : WebResourceBase { }
我想做的是有这样的声明。
new JavaScript() {
LocalPath = "/path/goes/here/1.js",
FtpPath = "ftp://path/goes/here/1.js"
}
这里显而易见的答案是使用隐式运算符,但问题是我想为那些与声明类型相同的属性分配派生类型,因此 LocalPath 和 FtpPath 将是 @987654325 类型@。
我希望我的解决方案比目前的解决方案更灵活。这段代码只是让我的皮肤爬行。希望有一种使用反射的方法,我尝试使用 StackTrace 类查找信息,但没有运气。任何帮助,将不胜感激。谢谢。
public abstract class ResourceBase {
public static implicit operator ResourceBase(string path) {
if (path.EndsWith(".js"))
return new JavaScript(path);
// etc...
}
}
【问题讨论】:
-
WebResourceBase是否应该派生自ResourceBase? -
我会实现一个显式函数来映射 this 而不是使用隐式运算符。这将使在项目生命周期中维护和理解代码变得更加困难。
-
@Vince 抱歉,我现在看到了问题。我会修改我的答案。
-
如果基类声明了一个接受字符串 (
path) 并返回ResourceBase的抽象方法,那么JavaScript类可以通过返回new JavaScript(path);来实现该方法,并且以此类推。 -
或者你应该简单地让你的
JavaScript类(和其他派生类)有一个带有两个字符串参数的构造函数。然后你可以在构造函数中做这些事情。您没有必须使用“对象初始化器”吗?
标签: c#