Как передать универсальный массив в конструктор - PullRequest
0 голосов
/ 19 июля 2011

Ну, я хочу передать ряд общих типов.Временно я использую AddParameter<T> и передаю значения один к одному.

Вопрос в том, как передать массив диапазонов интерфейсов типа переменной?

, который является универсальным интерфейсом

public interface IBusinessParameter<T>
{
  string Name { get; }
  T GetParameter();
}

Теперь это мой обладатель IBusinessParameter

namespace NewFixtures.Components.AnonymousQualifed
{
 public class BusinessParameterHolder : IBusinessParameterHolder
 {
   private readonly Hashtable _parameters;

   public BusinessParameterHolder()
   {
    _parameters = new Hashtable();
   }

   //that's not work
   //public BusinessParameterHolder(AddParameter<T>[] parameter)
   //{
   //}

   public void AddParameter<T>(IBusinessParameter<T> parameter)
   {
     _parameters.Add(parameter.Name, parameter);
   }
 }

}

, который сейчас в моем тесте, это работа

[Test()]
public void Should_Execute_Method_With_Variable_Parameters_And_Return3()
{

  IBusinessParameterHolder parameters = new BusinessParameterHolder();

  parameters.AddParameter(new BusinessParameter<int>("@param1",1));
  parameters.AddParameter(new BusinessParameter<int>("@param2",2));

  IBusinessResolver<int> businessResolver = new BusinessResolverDemo();

  int result = businessResolver.Solve(parameters);

  Assert.IsTrue(result == 3);

}

BusinessParameter типа IBusinessParameter

я хочу кое-как это сделать

[Test()]
public void Should_Execute_Method_With_Variable_Parameters_And_Return3()
{

  IBusinessParameterHolder parameters = new BusinessParameterHolder(new     
                   IBusinessParameter[]{
          new BusinessParameter<int>("@param1",1),
          new BusinessParameter<int>("@param2",2)}
  );

  IBusinessResolver<int> businessResolver = new BusinessResolverDemo();

  int result = businessResolver.Solve(parameters);

  Assert.IsTrue(result == 3);

}

Может кто-нибудь направить меня на свет?

Заранее спасибо.

Update ==

Тип данных в параметрах может быть любого типа

[Test()]
public void Should_Execute_Method_With_Variable_Parameters_And_Return3()
{

  IBusinessParameterHolder parameters = new BusinessParameterHolder();

  parameters.AddParameter(new BusinessParameter<int>("@param1",2));
  parameters.AddParameter(new BusinessParameter<string>("@param2","two in number is"));

  IBusinessResolver<string> businessResolver = new BusinessResolverDemo2();

  string result = businessResolver.Solve(parameters);

  Assert.IsTrue(result == "two in number is 2");

}

Обновлено 2011.11.28

ну наконец-то я понял, как это сделать.Я хочу сказать, что я решил это, но это не так, поэтому я обнаружил, что другой вопрос Как я могу сделать безопасную сумку типов, которые все реализуют общий интерфейс? .

, что является окончательнымверсия

public interface IBusinessParameterName
{
    string Name { get; }
}

public interface IBusinessParameter<T> : IBusinessParameterName
{
  T GetParameter();
}

, которая является держателем параметров с универсальным массивом в конструкторе

public class BusinessParameterHolder : IBusinessParameterHolder
{
  private readonly IDictionary<string, IBusinessParameterName> _parameters;

  public BusinessParameterHolder()
  {
    _parameters = new Dictionary<string, IBusinessParameterName>();
  }

  public BusinessParameterHolder(IBusinessParameterName[] parameters)
  {
    _parameters = new Dictionary<string, IBusinessParameterName>();
    AddParameterRange(parameters);
  }

  public void AddParameterRange(IBusinessParameterName[] parameters)
  {
    foreach (IBusinessParameterName parameter in parameters)
      _parameters.Add(parameter.Name, parameter);
  }

  public void AddParameter<T>(IBusinessParameter<T> parameter)
  {
    _parameters.Add(parameter.Name, parameter);
  }

  public void RemoveParameter(string name)
  {
    if (_parameters.ContainsKey(name))
    {
      _parameters.Remove(name);
    }
  }

  public T ResolverParameter<T>(string name)
  {
    if (_parameters.ContainsKey(name))
    {
      IBusinessParameter<T> rawParameter = (IBusinessParameter<T>) _parameters[name];
      return rawParameter.GetParameter();
    }

    return default(T);
  }
}

хорошо, тест

[Test()]
public void Should_Accept_RangeBusiness_Parameters_And_Resolver_Concat()
{
  IBusinessParameterHolder parameters = new BusinessParameterHolder(
        new IBusinessParameterName[]{ 
          new BusinessParameter<string>("@param1", "be or not be "), 
          new BusinessParameter<int>("@param2", 2)
        });

  IBusinessResolver<string> concatResolver = new ConcatStringResolverDemo();

  string result = concatResolver.Solve(parameters);

  Assert.IsTrue(result == "be or not be 2"); 
}

простой, но он понятия не имеет, каксделай это спасибо Марк Гравелл

1 Ответ

0 голосов
/ 19 июля 2011

Сделайте весь класс общим:

public class BusinessParameterHolder<T> : IBusinessParameterHolder
 {
   private readonly Hashtable<IBusinessParameter<T>> _parameters;

   public BusinessParameterHolder()
   {
    _parameters = new Hashtable<IBusinessParameter<T>>();
   }

   public BusinessParameterHolder(params IBusinessParameter<T>[] parameter)
   {
      foreach(T obj in parameter)
        AddParameter(obj);
   }

   public void AddParameter(IBusinessParameter<T> parameter)
   {
     _parameters.Add(parameter.Name, parameter);
   }
 }

Вам необходимо настроить объявление HashTable<T> в соответствии с вашими потребностями;вы действительно должны воспользоваться дженериками здесь.

...