强制执行元数据的,可以在不类的实例化
问题描述:
const
和static
类型属性/字段可以不创建的类的对象进行访问来访问:强制执行元数据的,可以在不类的实例化
[TestFixture]
public class TemporaryTests
{
[Test]
public void TmpTest1()
{
Assert.AreEqual("Name", TestClass.Name);
Assert.AreEqual("Description", TestClass.Description);
}
private class TestClass
{
public const string Name = "Name";
public static string Description = "Description";
}
}
是否有可能限定那些属性/字段在接口中,以便实现该接口的类实现该字段?
我试图做到的是有每一个类,实现某个接口,提供一种方法来访问他们的“口语姓名”及说明(每类应该有自己的执行/元信息)
编辑:只是要清楚:我意识到我不能在界面中使用const或静态,因为我在发布之前的研究已经发现了。我想知道的是,如果有办法强制实现某个接口的类来包含可以访问的元信息,而无需创建该类的对象。
答
以下代码可能是一种替代解决方案。
public interface IDesc
{
string Name { get; }
string Description { get; }
}
public static class Desc<T> where T : IDesc, new()
{
public static string Name
{
get
{
var property = typeof(T).GetProperty("Name");
return property.GetValue(new T()) as string;
}
}
public static string Description
{
get
{
var property = typeof(T).GetProperty("Description");
return property.GetValue(new T()) as string;
}
}
}
public class MyClass : IDesc
{
public string Name { get { return "name of class"; } }
public string Description { get { return "description"; } }
}
使用
var name = Desc<MyClass>.Name;
var description = Desc<MyClass>.Description;
+0
我很感谢你的努力,但是这为每个访问'new T()'创建了一个类的对象,这正是我不想要的(正如问题所述)。 现在,我将使用工厂模式,在工厂处理关于类注册的元信息。 :( – JohnRW
没有,没有 - 但。 C#8有可能会沿着这些路线发展。请参阅https://github.com/dotnet/csharplang/issues/164 –
感谢(难以置信的快速)答案!阅读这些提案需要一段时间。 :D – JohnRW