[英]Get the runtime type of a generic method parameter
我想要一个带有随机类型参数的泛型方法。
T
的实例应该是具有一些属性的模型,所以我想收集一个实例的所有公共属性。
此外,我希望为模型拥有一个Interface
或Superclass
,并且也能够在它们上使用其他继承内容。
问题是已作为SuperClass
或Interface
明确传递的模型的typeof(T)
结果没有关于子类的信息。
public interface ISomeInterface { int IProperty { get; } }
public class SomeClass : ISomeInterface
{
public int ClassProperty { get; set; } //I need this too
public int IProperty { get; set; }
}
class Program
{
static void Main(string[] args)
{
var v = (ISomeInterface)new SomeClass();
TestMethod(v);
Console.ReadKey();
}
static void TestMethod<T>(T value) where T : ISomeInterface
{
var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var p in props)
{
Console.WriteLine(p.Name);
}
}
}
输出将仅为IProperty
, ClassProperty
已被遗漏。
我不能确定将来总是像子类型那样明确传递值。
在这种情况下,即使对于空引用,有没有办法在不使用*.GetType()
的情况下获取实例的运行时类型?
使用GetType
而不是typeof
。 typeof
关键字在编译时解析,取决于变量的类型; GetType()
在运行时解析并取决于传递的对象的实际类型。
static void TestMethod<T>(T value) where T : ISomeInterface
{
var props1 = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var p in props1)
{
Console.WriteLine("Using typeof(T): {0}", p.Name);
}
var props2 = value.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var p in props2)
{
Console.WriteLine("Using value.GetType(): {0}", p.Name);
}
}
输出:
Using typeof(T): IProperty
Using value.GetType(): ClassProperty
Using value.GetType(): IProperty
请参阅DotNetFiddle上的示例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.