将字符串变量转换为对象类型引用

本文关键字:对象 类型 引用 转换 字符串 变量 | 更新日期: 2023-09-27 18:17:16

我的MVC5自定义Html helper类有以下方法:

public static bool CheckAccessRight(this HtmlHelper htmlHelper, string Action, string Controller)
{
    string displayName = GetPropertyDisplayName<Controller>(i => i.Action);
    // according to logic return a bool
}

GetPropertyDisplayName方法:

public static string GetPropertyDisplayName<T>(Expression<Func<T, object>> propertyExpression)
{
// some code
}

你可以看到GetPropertyDisplayName方法期待一个类(类型)和类成员作为它的参数。

但是在我的CheckAccessRight方法我只是接收类名(string Controller)和成员(string Action)作为字符串。

显然在这段出现了错误:<Controller>(i => i.Action);

我的问题是如何将这些字符串表示转换为真正的类或其他解决方案。

谢谢!

将字符串变量转换为对象类型引用

我不认为泛型方法会在你的情况下工作,我会解释为什么。

给定一个值为类型名的string,您可以使用以下方法获得Type对象:

var type = AppDomain.CurrentDomain.GetAssemblies()
              .SelectMany(x => x.DefinedTypes)
              .Single(x => x.Name == typeName);

现在,这里的问题:type将只在运行时已知,因为它依赖于typeNametypeName只在运行时已知。在泛型中,类型参数需要在编译时已知(解析表达式时,根据给定的约束,其他类型参数表现为编译时已知)。这就是为什么没有解决这个问题的方法(据我所知)。

那么,你必须求助于这个的运行时解析。我能想到的最明显的事情是,你可以取这个类型并分析它提供的内容:

public static string GetPropertyDisplayName(Type type, Expression<Func<object, object>> propertyExpression)
{
    // some code   
}

代码根据您想要从类型中提取的信息而变化,但通常有方法(如GetMembers(), GetMethods(), GetProperties()GetCustomAttributes())可以帮助您定位您正在寻找的内容。