强制执行元数据的,可以在不类的实例化

强制执行元数据的,可以在不类的实例化

问题描述:

conststatic类型属性/字段可以不创建的类的对象进行访问来访问:强制执行元数据的,可以在不类的实例化

[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或静态,因为我在发布之前的研究已经发现了。我想知道的是,如果有办法强制实现某个接口的类来包含可以访问的元信息,而无需创建该类的对象。

+1

没有,没有 - 但。 C#8有可能会沿着这些路线发展。请参阅https://github.com/dotnet/csharplang/issues/164 –

+0

感谢(难以置信的快速)答案!阅读这些提案需要一段时间。 :D – JohnRW

以下代码可能是一种替代解决方案。

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