2009-09-01 76 views
1

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

比方说,我在我的域模型如下定义:

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参数(i在这种情况下,参数为long)。


现在让我们假设有一天,我决定人的ID应该的GUID。我想要的是只能在我的Person类中更改它,并且它会在其他地方自动更改。如果我这样做,在我现在的代码中,PersonRepository.Get()方法不需要编辑,但我的Details()方法将不得不被更改。

我一直在寻找类似:

Details(Person.IdType id) { /*...*/ } 

哦,顺便说一下,这个“细节”的方法将位于另一个组件,如果这可能改变什么......

但强烈-typed,它必须接受值类型或引用类型。

任何想法?

谢谢!

回答

1

我不完全确定这是否是你想要的。你可以有方法采取Func<Person,T>并将其推断的类型你:

public T Get<T>(Func<Person,T> property) { 
    return property(myPerson); 
} 

,并称之为:

var id = PersonRepository.Get(p => p.Id); 

编译器能够从lambda表达式推断的T类型。

+0

不完全是这样,Repository部分没有问题,没有funcs。问题在于我的领域模型范围之外的其他方法。尽管我会尝试使用lambda表达式。谢谢! – 2009-09-01 22:42:15