如何将连接的字符串强制转换为Class.Property

本文关键字:转换 Class Property 字符串 连接 | 更新日期: 2023-09-27 17:49:33

我有一个静态类,其中有几个用于存储常量值的静态字符串。例如,Foo。Bar可能返回一个表示数据库列名和Foo的字符串。Foo可能返回一个带有epoch值的字符串。

在我的应用程序中,我需要将类名与字符串的名称连接起来以获得我需要的值。例如,我知道类名是Foo。我还知道属性名是Bar。但是,属性名称根据另一个值更改。在foreach中,我将类名与其他属性名连接起来以获得字符串"Foo.Bar"。到目前为止我们还好。当我将连接的字符串传递给接受字符串的方法时,它不会从类中检索静态字符串。换句话说,即使连接的字符串被正确地形成为"Foo。,我的方法不返回Foo.Bar的值。如果我硬编码Foo。我得到了我需要的字符串,但这需要在运行时完成。

有什么想法我可以解决这个问题吗?我能把这个投射到什么东西上吗?

public static class Foo
{
    public static string Bar = "Sample Text";
}
public class Program
{
    static void Main()
    {
     // string "Foo.Bar" is built here by combining two strings.
     ...
     // more processing
     ...
     // I need the literal value of Foo.Bar here not literally "Foo.Bar"...
     }
}

如何将连接的字符串强制转换为Class.Property

如果Foo始终是类,那么您可以只传递属性的名称而不是连接的字符串:

public string GetString(string propertyName)
{
    return typeof(Foo).GetProperty(propertyName).GetValue(null, null);
}

如果不总是Foo,也可以将类型传递给GetString()方法

Reflection…

考虑:

public class Foo
{
    public string Bar { get; set; }
}

你可以这样做:

Foo a = new Foo() { Bar = "Hello!" };
MessageBox.Show(typeof(Foo).GetProperty("Bar").GetValue(a,null) as string);

您需要使用反射。顺便说一下,反射很慢,会在运行时导致错误,对重构工具没有响应,等等,所以你可能需要重新考虑你是如何做事情的;如。, Dictionary<string, string>似乎更容易管理。

对于反射,您需要获得(a)类型,因为看起来您正在引用> 1类,然后(b)属性。比如:

var lookupKey = "Foo.Bar";
var typeName = lookupKey.Substring(0, lookupKey.LastIndexOf("."));
var propName = lookupKey.Substring(lookupKey.LastIndexOf(".") + 1);
var typeInfo = Type.GetType(typeName, true);
var propInfo = typeInfo.GetProperty(propName);
return propInfo.GetGetMethod().Invoke(null, null);