2012-09-10 53 views
3

我正在做一个配置提供商,在我服务层我有这样的:C#泛型返回值

public string GetValue(string key) 
{ 
    return _ctx.Configurations.SingleOrDefault(q => q.Key == key).Value; 
} 

但我怎么能获取的价值在它的原始类型,我想做到像这样的:

public T GetValue<T>(string key) 
{ 
    return (T)(object)_ctx.Configurations.Single(q => q.Key == key).Value; 
} 

正如此间指出,https://stackoverflow.com/a/9420236/544283,这将是一个滥用仿制药 ...我可以忍受的。

因为我知道类型我可以在方法外抛出值,并将其作为字符串在方法内部处理,但我想避免这种情况。

+1

Value有什么类型?如果Value属性是例如T的基类型,你可以设置T的where约束,然后直接进行转换而不需要对象部分。 – Centro

+0

由于值主要是字符串,int,布尔和日期时间我想我可以使用'where T:IConvertible'来限制它。 – Esteban

回答

7

只要你确信,中投不会失败,你可以使用:

var value = _ctx.Configurations.Single(q => q.Key == key).Value; 
return (T)Convert.ChangeType(value, typeof(T)); 

如果你想要安全,你应该做一些额外的检查,以确保该值实际上是投射到所需的类型。