我想要一个带有随机类型参数的通用方法。
T
的实例应该是具有某些属性的模型,所以我希望收集实例的所有公共属性。
另外,我想为模型提供一个Interface
或Superclass
,并能够在其上使用其他继承性东西。
问题在于,以typeof(T)
或SuperClass
形式传递的模型的Interface
结果显然没有有关子类的信息。
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()
的情况下获取实例的运行时类型?
答案 0 :(得分:0)
使用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
上的示例