我有一个带有几个静态字符串的静态类,用于存储常量值。例如,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"...
}
}
答案 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);