Лучший способ создать одно свойство для нескольких типов (. Net) - PullRequest
0 голосов
/ 04 августа 2020

У меня есть требование, ведущее меня по этому пути ...

public interface IThing
{
    string Id { get; set; }
}
public class ThingA : IThing
{
    public string Id { get; set; }
    public string Value { get; set; }
}
public class ThingB : IThing
{
    public string Id { get; set; }
    public long Value { get; set; }
}
public class ThingC : IThing
{
    public string Id { get; set; }
    public bool Value { get; set; }
}

Задача состоит в моделировании чего-либо со значением Value, которое может быть string / long / bool. Мне сложно работать с этим из-за постоянных проверок приведения, а сам интерфейс бесполезен. Есть ли традиционный подход к решению этой проблемы, о котором я не знаю? Или шаблон, который кто-то нашел, работает хорошо? Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Похоже, вам нужны дженерики:

public interface IThing
{
   string Id { get; set; }
}
public class Thing<T> : IThing
{
  public string Id { get; set; }
  public T Value { get; set; }
}

public class Program
{
    public static void Main()
    {
      var thingA = new Thing<int>();
      var thingB = new Thing<string>();
    
      thingA.Id = "A";
      thingA.Value = 42;
    
      thingB.Id = "B";
      thingB.Value = "Is a B";
    
      Console.WriteLine(thingA.Value);
      Console.WriteLine(thingB.Value);
   }
}

Где у вас будет базовый класс, который наследуется от вашего интерфейса, с типом нужного вам значения.

0 голосов
/ 07 августа 2020

Я закончил с этим дизайном ... Мне нужно было иметь какую-то базу, которую я мог бы создать, прежде чем я узнаю, каким будет тип значения. Я не смог избежать проблем, связанных с этим подходом (много кастинга), используя дженерики, а также помешал мне иметь базу agnosti c. Хотелось бы увидеть, как повысить удобство использования интерфейса (если возможно) для этого сценария.

public class BaseThing
{
    public string Id { get; set; }        
    public IValueConfig Configuration { get; set; }
    public string CommonProp { get; set; }...
}

public interface IValueConfig
{
    ValueType Type { get; }
}

public class RangeVal : IValueConfig
{
    public ValueType Type => ValueType.Range;
    public double Value { get; set; }
    public string UniqueProp { get; set; }...
}

public class StateVal : IValueConfig
{
    public ValueType Type => ValueType.State;
    public string Value { get; set; }
    public string UniqueProp { get; set; }...
}

public class BooleanVal : IValueConfig
{
    public ValueType Type => ValueType.Boolean;
    public bool Value { get; set; }
    public string UniqueProp { get; set; }...
}

public enum ValueType
{
    Range,
    State,
    Boolean
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...