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

时间:2014-03-10 19:35:37

标签: c# .net-4.5

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

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

有关我如何解决这个问题的任何想法?我可以把它投入某事吗?

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"...

     }
}

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

...反射

考虑:

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);

答案 2 :(得分:0)

你需要使用反射。另外 - 注意反射很慢(呃),可能会导致运行时出错,不会对重构工具做出响应等等,所以你可能想重新考虑一下你是如何做事的;例如,Dictionary<string, string>似乎更容易管理。

对于反思,你需要得到(a)类型,因为它似乎是你推荐的&gt; 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);