【发布时间】:2011-10-23 02:52:21
【问题描述】:
我现在在做什么:
void Main()
{
var command1 = new PersistenceCommand(new MyIntBO());
var command2 = new PersistenceCommand(new MyGuidBO());
var command3 = new PersistenceCommand(new PersistentBO());
Console.WriteLine(command1.ToString());
Console.WriteLine(command2.ToString());
Console.WriteLine(command3.ToString());
}
public class PersistenceCommand
{
public PersistenceCommand(PersistentBO businessObject)
{
_businessObject = businessObject;
}
public override string ToString()
{
string result = _businessObject.GetType().Name;
var keyed = _businessObject as IPrimaryKeyed<int>;
if (keyed != null)
{
result += " " + keyed.Id.ToString();
}
return result;
}
private readonly PersistentBO _businessObject;
}
public interface IPrimaryKeyed<out TKey>
{
TKey Id { get; }
}
public class PersistentBO {}
public class MyIntBO : PersistentBO, IPrimaryKeyed<int>
{
public int Id { get { return 1008; } }
}
public class MyGuidBO : PersistentBO, IPrimaryKeyed<Guid>
{
public Guid Id
{
get
{
return new Guid("6135d49b-81bb-43d4-9b74-dd84c2d3cc29");
}
}
}
打印出来:
MyIntBO 1008 我的GuidBO 持久BO
我想打印:
MyIntBO 1008 MyGuidBO 6135d49b-81bb-43d4-9b74-dd84c2d3cc29 持久BO
最优雅的方法是什么?
我想支持所有类型的键 - int、long、Guid 等 - 所以我宁愿不进行多次转换。请注意,并非每个业务对象都实现该接口(有些没有一个主键)。
我意识到我可以使用反射并尝试访问Id 属性。我想知道是否有更好的解决方案。
澄清:为了解决@Acaz Souza 和@Petar Ivanov 的答案,我们有几十个类分散在已经实现IPrimaryKeyed<T> 的多个程序集中。我不想通过扩展接口契约来破坏所有这些。如果我从头开始设计,他们的解决方案会奏效。
【问题讨论】:
标签: c# generics c#-4.0 casting