编辑 2我将如何真正解决问题。
我会让 InternalTableNumber 成为延迟加载的属性。如果它不可用,那么我会通过 InternalTableName 查找它。然后我总是只使用 InternalTableNumber 属性作为我的方法。
private int? internalTableNumber;
private int InternalTableNumber
{
get
{
if (!internalTableNumber.HasValue)
{
internalTableNumber = GetValueFromTableName( internalTableName );
}
return internalTableNumber;
}
set
{
internalTableNumber = value;
}
}
public int Number
{
get
{
string value = this.RunTableInfoCommand(InternalTableNumber,
TableInfoEnum.TAB_INFO_NUM);
return Convert.ToInt32( value );
}
}
编辑 使用多态性...
假设您当前的类名为 Foo,那么我会将它重构为两个类,FooWithName 和 FooWithNumber。FooWithName 将是您在拥有表名时使用的类,而 FooWithNumber 将是在您拥有表号时使用的类。然后,我将使用 Number 方法编写每个类——实际上,我将编写一个接口 IFoo 以及每个接口,以便它们可以互换使用。
public interface IFoo
{
int Number { get; }|
}
public class FooWithName : IFoo
{
private string tableName;
public FooWithName( string name )
{
this.tableName = name;
}
public int Number
{
get { return this.RunTableInfoCommand(this.tableName,
TableInfoEnum.TAB_INFO_NUM);
}
... rest of class, including RunTableInfoCommand(string,int);
}
public class FooWithNumber : IFoo
{
private int tableNumber;
public FooWithNumber( int number )
{
this.tableNumber = number;
}
public int Number
{
get { return this.RunTableInfoCommand(this.tableNumber,
TableInfoEnum.TAB_INFO_NUM);
}
... rest of class, including RunTableInfoCommand(int,int);
}
你会这样使用它:
IFoo foo;
if (tableNumber.HasValue)
{
foo = new FooWithNumber( tableNumber.Value );
}
else
{
foo = new FooWithName( tableName );
}
int number = foo.Number;
显然,除非您在现有类中有很多 if-then-else 构造,否则此解决方案实际上并没有对其进行太大改进。该解决方案使用多态创建 IFoo,然后只使用接口方法而不关心实现。这可以很容易地扩展为在继承 IFoo 并且是 FooWithNum 和 FooWithName 的基类的抽象类中继承 RunTableCommand( int ) 的通用实现。