У меня есть интерфейс:
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 - это то, что я пытаюсь решить.Надеюсь, это понятнее.