Могу ли я определить свойство, которое доступно как типу класса, так и экземплярам класса? - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть интерфейс для базового класса, и каждый класс, который наследуется от базового класса, должен иметь поле идентификации, которое сообщает приложению, какой это тип объекта.

Я хотел использовать это свойство вдва разных способа:

Без создания экземпляра объекта

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

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

И как свойство интерфейса

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

Есть ли простой способ определитьId поле в интерфейсе, но все еще оно доступно для использования без создания экземпляра класса?

Сейчас я использую следующий код.Я мог бы добавить к интерфейсу только для чтения свойство Id, которое возвращает строку констант, однако я надеялся, что есть более простой способ, о котором я просто не знаю.

public interface ITest
{

}

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

Ответы [ 5 ]

4 голосов
/ 23 февраля 2012

Короче - нет.

Чтобы сделать это, вам необходимо указать это как свойство экземпляра интерфейса (и реализовать его в экземпляре) и как статическое свойство типа.

Компилятор не позволит вам сделать это.

1 голос
/ 23 февраля 2012

Вы можете поместить его в интерфейс, а также иметь его как статическое свойство. Что-то вроде:

interface IInterface { Id { get; } }

class Class : IInterface
{
  public static Id { get { return 1; } }
  public Id { get { return Class.Id; } }
}
0 голосов
/ 23 февраля 2012

Как насчет использования атрибутов? Вот небольшой пример того, что можно сделать:

[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();
    }
}
0 голосов
/ 23 февраля 2012

Вы могли бы сделать это таким образом.

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();
0 голосов
/ 23 февраля 2012

Я столкнулся с подобной проблемой, Рэйчел, и я всегда (к сожалению) прибегал к тому, чтобы этот код фабрики полагался на отражение, чтобы получить общедоступное статическое свойство "TypeID" для каждого конкретного типа ... таким образом, делая дополнительный аспект контрактного интерфейса, но не имеющий его в коде интерфейса C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...