在recent question on Stack Overflow中,我问我如何通过文件名解析文件的额外元信息。
在我解决了这个问题之后,我决定创建一种新类型的对象来保存元数据和原始文件。我想我可能会做这样的事情:
class BackupFileInfo : FileInfo, IEquatable<BackupFileInfo>
{
//Properties and Methods here
}
我的想法是,在实现FileInfo
的对象的属性中添加元信息时,我将保留原始FileInfo
对象,例如IsMainBackup
。
但是,FileInfo
已被封存,这意味着其他类无法从中继承。
相反,我最终得到了以下内容:
class BackupFileInfo : IEquatable<BackupFileInfo>
{
public bool IsMainBackup { get; set; }
public int ImageNumber { get; set; }
public int IncrementNumber { get; set; }
public FileInfo FileInfo { get; set; }
//public BackupFileInfo() //constructor here
public bool Equals(BackupFileInfo other)
{
return (this.FileInfo.Name == other.FileInfo.Name
&& this.FileInfo.Length == other.FileInfo.Length);
}
}
我对此解决方案并不十分兴奋,因为我不得不使用BackupFileInfo.Length
,而是使用BackupFileInfo.FileInfo.Length
。也许这已经是最佳实践,但有些事情感觉不对。
有更好的方法来解决这个问题吗?
答案 0 :(得分:27)
这是经典的作品之一,而不是继承的例子,你走的是正确的方向。
要解决您的属性问题,只需创建一个名为Length
的属性,该属性委托给封装的FileInfo
对象。
答案 1 :(得分:10)
您可以在您关注的FileInfo上公开属性。像这样:
public long Length { get { return FileInfo.Length; } }
如果要将大量属性委托给FileInfo,这显然变得不太实用。
答案 2 :(得分:8)
您可以在班级中添加implicit运算符。
例如:
class BackupFileInfo .... {
/* your exiting code */
public static implicit FileInfo( BackupFileInfo self ){
return self.FileInfo;
}
}
然后,您可以将BackupFileInfo对象视为FileInfo对象,如此
BackupFileInfo bf = new BackupFileInfo();
...
int mylen = ((FileInfo)bf).Length;
答案 3 :(得分:4)
直通?
class BackupFileInfo : IEquatable<BackupFileInfo>
{
public long Length {get {return FileInfo.Length;}}
//.... [snip]
}
此外,一个名为FileInfo
的道具正在寻找麻烦......在一些地方可能需要消除对FileInfo
班级的歧义。
答案 4 :(得分:2)
如果您愿意,可以轻松地将文件信息属性包装在您自己的属性中。
public long Length
{
get
{
return this.FileInfo.Length;
}
}
答案 5 :(得分:2)
这并没有真正解决你的大问题,但当然你可以让你想要使用的属性充当下面真实属性的代理。 E.g。
public long Length
{
get {return FileInfo.Length;}
}
(当然有适当的空检查。)