我有一个界面:
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获取任何具体类的静态Name属性的VALUE。然而,对于我可怜的大脑的生活,我无法想出代码来实现这一目标。任何提示都会很棒。
编辑(澄清):
我知道static属性需要从基类读取。然而....
静态字段将包含具体类的基本名称 - &gt;通过基类的静态构造函数中的反射派生。这样做(我知道如何完成它)就像我们在整个地方一样。
在这种情况下,我正在尝试构建一个需要知道这个静态字段的工厂类,并且由于工厂实现的一些(其他)要求,需要通过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;
}
}
foreach循环中IntefaceFactory的静态构造函数中的部分是我试图解决的问题。希望这更清楚。
答案 0 :(得分:3)
这是如何从实例获取具体类的静态属性:
var staticProperty = instance.GetType()
.GetProperty("<PropertyName>", BindingFlags.Public | BindingFlags.Static);
var value = staticProperty.GetValue(instance, null);
答案 1 :(得分:1)
static
成员不会按照您的想法行事。它们属于基类,因此使用static
继承的成员无法实现您的尝试。