【发布时间】:2018-01-18 13:02:42
【问题描述】:
我有以下方法
public bool HasTypeAttribute<TAttribute, TType>(TType obj)
{
return typeof(TType).GetCustomAttribute<TAttribute>() != null;
}
我希望能够像这样使用它:
MyClass instance = new MyClass();
TypeHelper.HasTypeAttribute<SerializableAttribute>(instance);
但我无法让它工作,因为
类型参数的数量不正确
所以我需要打电话
TypeHelper.HasTypeAttribute<SerializableAttribute, MyClass>(instance);
这当然是有道理的,但是为什么编译器不能推断出传递对象的类型呢?因为如果方法看起来像这样:
public void Demo<T>(T obj)
{
}
编译器肯定能推断出类型,所以我可以写
Foo.Demo(new Bar());
而不是
Foo.Demo<Bar>(new Bar());
那么,在这种情况下,有没有办法让类型推断起作用?这是我的设计缺陷还是我可以实现我想要的?重新排序参数也无济于事......
【问题讨论】:
-
你可以传入一个
object并使用obj.GetType而不是typeof(TType) -
@juharr 不会给出相同的结果。
-
@JonHanna 为什么不呢?如果对象与泛型类型相同,它应该可以工作。
-
@ThomasFlinkow 我的意思是你会有
public bool HasTypeAttribute<TAttribute>(object obj)。基本上它不能做部分泛型类型推断。它必须推断所有这些或必须指定所有。 -
@juharr,如果对象与泛型类型不同,它的工作方式会有所不同。只有当对象的实际具体类型 (
object.GetType()) 与编译器从中推断的表达式的类型匹配时,它们才会相同,如果该类型是基类型或接口,则情况并非如此。
标签: c# generics type-inference