2010-04-19 4 views
4

У меня есть класс 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, чтобы получить значение свойства строки напрямую, будет достаточным, но не идеальным.

ответ

5

Попробуйте это ...
Редактировать: Я не думал просто использовать тип вместо экземпляра объекта, когда он был статическим свойством.
Удаленоvar obj = Activator.CreateInstance(type); и использовать type в prop.GetValue вместо 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); 
+0

Ну, это почти то же самое, что и мой ответ, но помните, что он отражает статическое свойство, поэтому нет необходимости создавать его с помощью 'Activator', прежде чем получить значение. –

+0

@Kyle Rozendo, вы правы в создании объекта. Разница заключается в получении типа. –

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"); 
+0

Сам класс является внутренним, поэтому typeof (C) не компилируется. Как получить тип класса, если вы не можете ссылаться на него во внешней сборке? – Echiban

+0

@Ech - Вы пробовали отражать классы таким же образом, как и выше, используя правильные 'BindingFlags'? –

+0

'typeof (C)' недействителен, если есть *** внутренний статический класс ***? – Kiquenet

Смежные вопросы