我有一个关于泛型类型参数的问题。
假设我的域模型中有以下定义:
abstract class Entity<TId>
{
public TId Id { get; private set; }
/* ... */
}
class Person : Entity<long>
{
public string Name { get; set; }
/* ... */
}
现在假设我想创建一种方法来查看某个人的详细信息:
public void Details(long? id)
{
if (!id.HasValue) {
Error(...);
return;
}
var person = PersonRepository.Get(id.Value);
ShowPersonDetail(person);
}
让我们进一步说明 PersonRepository 是存储库的特化,以便其“Get”方法“自动”实现,以接受正确的强类型id参数(在本例中为long
参数)。
现在让我们说有一天我决定人的ID应该是Guids 。我想要的是能够在我的Person类中更改它,并且它会自动在其他地方更改。如果我这样做,在我现在的代码中,不需要编辑PersonRepository.Get()方法,但我的Details()方法将不得不改变。
我正在寻找类似的东西:
Details(Person.IdType id) { /*...*/ }
哦,顺便说一句,这个“详细信息”方法将位于另一个程序集中,如果这可能会改变任何内容......
但是强类型,它必须接受值类型或引用类型。
有什么想法吗?
谢谢!
答案 0 :(得分:1)
我不确定这是否是你想要的。您可以让方法采用Func<Person,T>
并让它为您推断出类型:
public T Get<T>(Func<Person,T> property) {
return property(myPerson);
}
并将其命名为:
var id = PersonRepository.Get(p => p.Id);
编译器能够从lambda表达式中推断出T
的类型。