通用参数类型

时间:2009-09-01 21:36:25

标签: c# generics parameters

我有一个关于泛型类型参数的问题。

假设我的域模型中有以下定义:

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) { /*...*/ }

哦,顺便说一句,这个“详细信息”方法将位于另一个程序集中,如果这可能会改变任何内容......

但是强类型,它必须接受值类型或引用类型。

有什么想法吗?

谢谢!

1 个答案:

答案 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的类型。