C # Reflection Получение статического свойства конкретного класса из интерфейса - PullRequest
3 голосов
/ 24 мая 2011

У меня есть интерфейс:

interface IInterface 
{
    string Name { get; }
}

, который реализован общим абстрактным классом:

public class BInterface<T> : IInterface
{
    static BInterface() 
    { 
        // Or anything that would be implementation class specific
        Name = typeof(BInterface<>).GetType().Name;  
    }
    public static string Name { get; private set; }
    string IInterface.Name { get { return Name; } }
}

, который, в свою очередь, реализован в конкретном классе:

public class CInterface : BInterface<int> 
{
}

Я знаю, как получить ссылки на конкретные классы через 'type.IsAssignableFrom', '! Type.IsInterface' и '! Type.IsAbstract', но это все, что мне удалось.

Мне нужно получить через Reflection значение VALUE статического свойства Name для любого из конкретных классов.Тем не менее, для жизни моего бедного мозга, я не могу придумать код для этого.Любые подсказки были бы хорошими.

РЕДАКТИРОВАТЬ (В пояснениях):

Я знаю, что статическое свойство необходимо читать из базового класса.Однако ....

Статическое поле будет содержать базовое имя конкретного класса ->, полученное путем отражения в статическом конструкторе базового класса.Это работает (и я знаю, как это сделать), так как мы делаем это повсеместно.

В этом случае я пытаюсь создать фабричный класс, который должен знать это статическое поле и должен получитьк нему через Reflection из-за некоторых (других) требований фабричной реализации.

РЕДАКТИРОВАТЬ (снова) Расширенный код:

Вот почти полный, но бесполезныйПример того, чего я пытаюсь достичь.

    public interface IInterface
    {
        string Name { get; }
        object Value { get; set; }
    }

    public class BInterface<T> : IInterface
    {
        static BInterface()
        {
            // Or anything that would be implementation class specific
            Name = typeof(BInterface<>).GetType().Name; // Should be CInterface, DInterface depending on which class it is called from.
        }

    string IInterface.Name { get { return Name; } }
    object IInterface.Value { get { return Value; } set { Value = (T)value; } }

    public static string Name { get; private set; }
    public T Value { get; set; }
}

public class CInterface : BInterface<int>
{
}

public class DInterface : BInterface<double>
{
}

public static class InterfaceFactory
{
    private readonly static IDictionary<string, Type> InterfaceClasses;

    static InterfaceFactory()
    {
        InterfaceClasses = new Dictionary<string, Type>();

        var assembly = Assembly.GetExecutingAssembly();
        var interfaceTypes = assembly.GetTypes()
                                     .Where( type => type.IsAssignableFrom(typeof (IInterface)) 
                                         && !type.IsInterface 
                                         && !type.IsAbstract);
        foreach (var type in interfaceTypes)
        {
            // Get name somehow
            var name = "...";
            InterfaceClasses.Add(name, type);
        }
    }

    public static IInterface Create(string key, object value, params object[] parameters)
    {
        if (InterfaceClasses.ContainsKey(key))
        {
            var instance = (IInterface) Activator.CreateInstance(InterfaceClasses[key], parameters);
            instance.Value = value;

            return instance;
        }
        return null;
    }
}

Часть в статическом конструкторе IntefaceFactory внутри цикла foreach - это то, что я пытаюсь решить.Надеюсь, это понятнее.

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

Вот как получить статическое свойство конкретного класса из экземпляра:

var staticProperty = instance.GetType()
    .GetProperty("<PropertyName>", BindingFlags.Public | BindingFlags.Static);
var value = staticProperty.GetValue(instance, null);
1 голос
/ 24 мая 2011

static участники не работают так, как вы думаете. Они принадлежат к базовому классу, и поэтому то, что вы пытаетесь сделать, невозможно с static унаследованным членом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...