我可以定义一个可用于类类型和类实例的属性吗?

时间:2012-02-23 17:54:29

标签: c# inheritance

我有一个基类接口,每个从基类继承的类都应该有一个标识字段,告诉应用程序它是什么类型的对象。

我想以两种不同的方式使用此属性:

不创建对象的实例

if (someValue == TestA.Id)
    return new TestA();

elseif (someValue == TestB.Id)
    return new TestB();

作为界面的属性

void DoSomething(ITest testObject)
{
    SomeValue = testObject.Id;
}

是否有一种简单的方法可以在界面中定义Id字段,但仍然可以在不创建类实例的情况下使用它?

现在我正在使用以下代码。我可以向返回const字符串的接口添加一个只读Id属性,但我希望有一种更简单的方法,我只是不知道。

public interface ITest
{

}

public class TestA : ITest
{
    public const string Id = "A";
}

5 个答案:

答案 0 :(得分:4)

总之 - 没有。

为了能够做到这一点,您需要能够将其指定为接口上的实例属性(并在实例中实现),并作为类型的静态属性。 / p>

编译器不允许你这样做。

答案 1 :(得分:1)

您可以将其放在界面中,并将其作为静态属性。类似的东西:

interface IInterface { Id { get; } }

class Class : IInterface
{
  public static Id { get { return 1; } }
  public Id { get { return Class.Id; } }
}

答案 2 :(得分:0)

我遇到了类似的问题,Rachel,并且我总是(不幸的是)使用该工厂代码依赖于反射来获得每个具体类型的“TypeID”公共静态属性...因此另外合同接口的一个方面,但没有在C#接口代码中。

答案 3 :(得分:0)

你可以这样做。

public interface ITest
{
    SomeValue Id{ get;}
}


public class TestA : ITest
{
    public SomeValue Id 
    {
       get {return TestA.StaicId; }
    }

    public static SomeValue StaticId
    {
         get {return "This is TestA";}
    }
}


if (someValue == TestA.StaticId)
       return new TestA();

答案 4 :(得分:0)

如何使用属性?以下是可以做的事情的一个小例子:

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class IdAttribute : Attribute
{
    public IdAttribute(string id)
    {
        this.Id = id;
    }

    public string Id { get; set; }
}

public interface IMyInterface
{
}

public abstract class BaseClass : IMyInterface
{
    public static string GetId<T>() where T : IMyInterface
    {
        return ((IdAttribute)typeof(T).GetCustomAttributes(typeof(IdAttribute), true)[0]).Id;
    }
}

[Id("A")]
public class ImplA : BaseClass
{
}

[Id("B")]
public class ImplB : BaseClass
{
}

internal class Program
{
    private static void Main(string[] args)
    {
        var val1 = BaseClass.GetId<ImplA>();

        var val2 = BaseClass.GetId<ImplB>();

        Console.ReadKey();
    }
}