反射:对象被赋值
Reflection: object is typed assigned
如何从 Doit-method() 的参数(类型为 SomeObject)变量中获取字段?
我无法更改 Doit 方法的签名,也无法在 Doit 方法中使用 SomeObject。
static void Main(string[] args)
{
Doit(typeof(SomeObject));
}
private static string Doit(object parameter)
{
var field = parameter.GetType().GetField("MyString");
return field.GetValue("MyString").ToString();
}
我假设您的 parameter
变量是 SomeObject
.
类型
通常,您只想在您的方法中进行强制转换,如下所示:
private static string Doit(object parameter)
{
var field = ((SomeObject)parameter).GetField("MyString");
return field.GetValue("MyString").ToString();
}
如果您确实无法从该方法中访问 SomeObject
类型,您可以尝试使用 dynamic 关键字来允许后期绑定调用。它会比使用 Reflection API 看起来更好。像这样:
private static string Doit(object parameter)
{
var field = ((dynamic)parameter).GetField("MyString");
return field.GetValue("MyString").ToString();
}
但是请注意,就像使用反射 API 一样,如果您在使用 dynamic
时方法调用错误,编译器将无法帮助您。它会在运行时失败。
编辑
如果你想投反对票,没关系,但我很感激它伴随着建设性的评论。
如何从 Doit-method() 的参数(类型为 SomeObject)变量中获取字段? 我无法更改 Doit 方法的签名,也无法在 Doit 方法中使用 SomeObject。
static void Main(string[] args)
{
Doit(typeof(SomeObject));
}
private static string Doit(object parameter)
{
var field = parameter.GetType().GetField("MyString");
return field.GetValue("MyString").ToString();
}
我假设您的 parameter
变量是 SomeObject
.
通常,您只想在您的方法中进行强制转换,如下所示:
private static string Doit(object parameter)
{
var field = ((SomeObject)parameter).GetField("MyString");
return field.GetValue("MyString").ToString();
}
如果您确实无法从该方法中访问 SomeObject
类型,您可以尝试使用 dynamic 关键字来允许后期绑定调用。它会比使用 Reflection API 看起来更好。像这样:
private static string Doit(object parameter)
{
var field = ((dynamic)parameter).GetField("MyString");
return field.GetValue("MyString").ToString();
}
但是请注意,就像使用反射 API 一样,如果您在使用 dynamic
时方法调用错误,编译器将无法帮助您。它会在运行时失败。
编辑
如果你想投反对票,没关系,但我很感激它伴随着建设性的评论。