我有一个问题要Type
在我的代码中定义。让我们从 Abc 开始。
public partial class Abc {
public static String AbcName="wtf";
public String Name {
get;
set;
}
}
好的,Abc
完成了。之后是测试课。而且我需要返回带有 的实例的对象或类型MyClass
,这里是
public partial class MyClass {
public const BindingFlags
Universal=BindingFlags.NonPublic|BindingFlags.Public,
WithObject=Universal|BindingFlags.Instance,
WithClass=WithObject|BindingFlags.Static,
ForGive=Universal|BindingFlags.SetProperty|BindingFlags.SetField,
ForGet=Universal|BindingFlags.GetProperty|BindingFlags.GetField,
ForDo=BindingFlags.InvokeMethod|WithObject|WithClass;
public MyClass GetTypeImpl() {
if(null!=target)
#if TARGET_AS_TYPE
return new MyClass(target as Type??target.GetType());
#else
return new MyClass(target.GetType());
#endif
else
return new MyClass(typeof(object));
}
public object GetValue(String name) {
var invokeAttr=ForGet|WithClass;
var type=(Type)this.GetTypeImpl().target;
return type.InvokeMember(name, invokeAttr, default(Binder), target, default(object[]));
}
public MyClass(object x) {
this.target=x;
}
public object target;
}
请注意,代码用于代表我的班级。GetValue
真正的代码是在内部调用的,消费代码永远不会得到除了MyClass
. 也就是说,在实际代码中,每个方法MyClass
实际上都是返回一个MyClass
. 在这里,我们看到条件编译,带有TARGET_AS_TYPE
,这就是这个问题的重点。
考虑以下测试代码
public partial class TestClass {
public static void TestMethod() {
var abc=
new Abc {
Name="xyz"
};
var x=new MyClass(abc);
var abcName=x.GetValue("Name");
var y=new MyClass(x.GetTypeImpl().target);
#if TARGET_AS_TYPE
var wtf=y.GetValue("AbcName");
var fullName=y.GetValue("FullName"); // exception thrown
#else
var fullName=y.GetValue("FullName");
var wtf=y.GetValue("AbcName"); // exception thrown
#endif
}
}
无论我们是否定义TARGET_AS_TYPE
,测试总是在第二行用#if
or#elseif
块抛出异常。我认为这是因为Type
or RuntimeType
,但我无法定义它。那么,如何纠正它(在 GetTypeImpl 中)并让它在没有条件编译的情况下始终工作?
以下方式受到限制,或者我已经完成了没有效果。
- 使用
BindingFlags.FlattenHierarchy
- 不工作 - 泛型声明
MyClass<T>
- 不起作用 - 不要用实例扭曲类型或对象
MyClass
- 你一定是在开玩笑......