我在A组中有一个C类:
internal class C
{
internal static string About_Name {
get { return "text"; }
...
}
我有大约20个这样的静态属性。有没有办法,在外部程序集中,不使用友元汇编属性(仅限.Net反射),获取类C,以便我可以调用任何静态字符串属性,如下所示:
Class C = <some .Net reflection code>;
string expected = C.About_Name;
如果无法做到这一点,直接获取字符串属性值的.Net反射代码就足够了,但并不理想。
答案 0 :(得分:5)
试试这个......
编辑:当它是静态属性时,我没有想到只使用类型而不是对象实例。
已移除 var obj = Activator.CreateInstance(type);
并在prop.GetValue中使用type
而不是obj
。
namespace ClassLibrary1
{
internal class Class1
{
internal static string Test { get { return "test"; } }
}
public class Class2
{
}
}
var ass = Assembly.GetAssembly(typeof(Class2));
var type = ass.GetType("ClassLibrary1.Class1");
var prop = type.GetProperty("Test", BindingFlags.Static
| BindingFlags.NonPublic);
var s = (string)prop.GetValue(type, null);
答案 1 :(得分:0)
是的,可以做到。
它正在使用Type.GetProperty()
。
示例:
// Load your assembly and Get the Type
// Assembly load code...
...
// Get type
Type asmType = typeof(C);
// Get internal properties
PropertyInfo pi = asmType.GetProperty("About_Name", BindingFlags.NonPublic | BindingFlags.Static);
// Get Value
var val = pi.GetValue(asmType, null);
此代码将在text
中返回“val
”,因此您可以根据需要执行此操作。
要在您想要的意义上执行此操作,请将代码编写为如下方法:
private static string GetString(Type classToCheck, string PropertyName)
{
PropertyInfo pi = classToCheck.GetProperty(PropertyName, BindingFlags.NonPublic | BindingFlags.Static);
object val = null;
if (pi != null)
val = pi.GetValue(classToCheck, null);
return (val != null) ? val.ToString() : string.Empty;
}
用法将是:
string expected = GetString(typeof(C), "About_Name");