使接口为通用接口,然后使用Func<INode,T>
作为密钥的选择器。这假定您想要从节点中提取字典的密钥。如果这不是一个硬性要求,那么您可以使用签名中的泛型类型说明符来指定键本身。
public interface ITopology<T>
{
Dictionary<T, INode> Nodes { get; set; }
}
public static class TopologyExtns
{
public static void AddNode<T>(this ITopology<T> topIf, INode node, Func<INode,T> keySelector)
{
topIf.Nodes.Add(keySelector(node), node);
}
public static INode FindNode<T>(this ITopology<T> topIf, T searchKey)
{
return topIf.Nodes[searchKey];
}
}
public class TopologyImp<T> : ITopology<T>
{
public Dictionary<T, INode> Nodes { get; set; }
public TopologyImp()
{
Nodes = new Dictionary<T, INode>();
}
}
你也可以考虑让INode成为一个通用类型。这将允许您将Key指定为泛型类型的属性,该类型的实现可以推迟到适当的“真实”键。这将使您无需为扩展方法提供密钥或选择器。
备选:
public interface INode<T>
{
T Key { get; }
string Name { get; set; }
int ID { get; set; }
}
public class StringNode : INode<string>
{
public string Key { get { return this.Name; } }
public string Name { get; set; }
public int ID { get; set; }
}
public interface ITopology<T>
{
Dictionary<T, INode<T>> Nodes { get; set; }
}
public static class TopologyExtns
{
public static void AddNode<T>(this ITopology<T> topIf, INode<T> node)
{
topIf.Nodes.Add(node.Key, node);
}
public static INode<T> FindNode<T>(this ITopology<T> topIf, T searchKey)
{
return topIf.Nodes[searchKey];
}
}
public class TopologyImp<T> : ITopology<T>
{
public Dictionary<T, INode<T>> Nodes { get; set; }
public TopologyImp()
{
Nodes = new Dictionary<T, INode<T>>();
}
}
用作:
var topology = new TopologyImp<string>();
topology.AddNode(new StringNode { Name = "A", ID = 0 } );
var node = topology.FindNode("A");
TopologyExtns是错误的 - ITopology现在是通用的,你需要要么使扩展方法一般或参数参考具体。 – 2010-05-06 18:20:54
感谢@Matt,很好。 – derek 2010-05-06 18:29:13