反射:对象被键入分配

时间:2015-07-08 17:14:05

标签: c# reflection

如何从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();
    }

1 个答案:

答案 0 :(得分:0)

我认为您的private static string Doit(object parameter) { var field = ((SomeObject)parameter).GetField("MyString"); return field.GetValue("MyString").ToString(); } 变量的类型为SomeObject

通常情况下,您只想在方法内部进行转换,如下所示:

private static string Doit(object parameter)
{
    var field = ((dynamic)parameter).GetField("MyString");
    return field.GetValue("MyString").ToString();
}

如果您真的无法访问该方法中的dynamic类型,则可以尝试使用§5.6.2关键字来允许延迟绑定的调用。它看起来比使用Reflection API更好。像这样:

replace(OrgString, "^(.{5})((.*?)([0-9])(.*?)([0-9])(.*)|(.{6})(.)(.)(.*))(.{5})$",
                   "$1$3$6$5$4$7$8$10$9$11$12")

但要注意,就像使用Reflection API一样,如果在使用select * from sys.dm_db_log_space_usage select * from sys.dm_tran_database_transactions select * from sys.dm_tran_active_transactions select * from sys.dm_tran_current_transaction 时方法调用错误,编译器将无法帮助您。它会在运行时失败。

修改

如果你想进行投票,那没关系,但是当它伴随着建设性的评论时,我确实感激不尽。