在最近关于Stack Overflow的问题中,我问我如何通过文件名解析文件的额外元信息.
在我解决了这个问题之后,我决定创建一种新类型的对象来保存元数据和原始文件.我想我可能会这样做:
class BackupFileInfo : FileInfo, IEquatable<BackupFileInfo>
{
//Properties and Methods here
}
Run Code Online (Sandbox Code Playgroud)
我的想法是,我会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);
}
}
Run Code Online (Sandbox Code Playgroud)
我对这个解决方案并不十分兴奋,因为BackupFileInfo.Length我不得不使用它,而不是能够使用BackupFileInfo.FileInfo.Length.也许这已经是最佳实践,但有些事情感觉不对.
有没有更好的方法来处理这个问题?
Jas*_*yon 29
这是一个经典的组合而不是继承的例子,你走的是正确的方向.
要解决属性问题,只需创建一个名为Length委托给封装FileInfo对象的属性.
Sea*_*lin 11
您可以在您关心的FileInfo上公开属性.像这样的东西:
public long Length { get { return FileInfo.Length; } }
Run Code Online (Sandbox Code Playgroud)
如果要将大量属性委托给FileInfo,这显然变得不太实用.
Ian*_*ton 10
您可以在类中添加隐式运算符.
例如:
class BackupFileInfo .... {
/* your exiting code */
public static implicit operator FileInfo( BackupFileInfo self ){
return self.FileInfo;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以像处理FileInfo对象一样处理BackupFileInfo对象
BackupFileInfo bf = new BackupFileInfo();
...
int mylen = ((FileInfo)bf).Length;
Run Code Online (Sandbox Code Playgroud)
穿越?
class BackupFileInfo : IEquatable<BackupFileInfo>
{
public long Length {get {return FileInfo.Length;}}
//.... [snip]
}
Run Code Online (Sandbox Code Playgroud)
另外,一个名为 的 propFileInfo正在自找麻烦……它可能需要FileInfo在一些地方对类进行消歧。