0

我想开发一个包含字符串值的基本类,并且我想传递一个转换规则,该值应如何存储为 int 值。

当我没有完全错的时候,这应该可以使用某种委托。不幸的是,我不知道如何开始以及在互联网上搜索什么。

这里有一个简单的例子:

    class MyClass
    {
      public string InputString { get; private set; }
      public int OutputValue { get; set; }
      public MyClass(string inputString)
      {
        this.InputString = inputString;
      }

      //I suspect that I need a method here taking some kind of delegate?
    }

    MyClass mC = new MyClass("abcd");

    //here I now want to pass something to mC saying that each character should 
    // be transformed to its ascii value and be added to a total value

    //or another object should transform abcd interpreting it hexadecimal
4

3 回答 3

2

你想要类似的东西Func<string, int>

Func<string, int> converter = (theString) => int.Parse(theString);

然后让您的类型采用 a Func<string, int>,可能在构造函数中,并在需要转换时调用它:

converter(InputString);

这个委托的实现可以是任何你喜欢的,只要它接受 astring并返回一个int.

一种可能的方式(没有具体说明每个字符的 ASCII 值):

class MyClass
{
    private Func<string, int> _valueConverter;

  public string InputString { get; private set; }
  public int OutputValue { get { return _valueConverter(InputString); } }

  public MyClass(string inputString, Func<string, int> valueConverter)
  {
    _valueConverter = valueConverter;
    this.InputString = inputString;
  }
}

// As a lambda
MyClass mC = new MyClass("2", input => int.Parse(input));

您可以提供一些东西来实现Func参数,如我上面显示的 lambda 表达式或方法组:

private static int AMethodThatMatchesTheFuncSignature(string value)
{
    return 42;
}

var mC = new MyClass("2", AMethodThatMatchesTheFuncSignature);

如果您以前从未见过它,Func<T1, T2>它只是框架提供的一个预制委托(有很多类型的定义FuncAction没有参数,最多有很多参数。Action全部返回 void 并且Func全部返回最终定义的类型TResult)。

于 2013-05-07T15:31:33.060 回答
1

您还可以使用设计模式“策略”来“委托”算法的实现。

(没有错误处理)

interface IConverter
{
    int Convert(string value);
}

class ASCIConverter : IConverter
{
    public int Convert(string value)
    {
        //conversion implementation here
    }
}

class MyClass
{

    string Input;
    IConverter Converter;
    public MyClass(string input, IConverter converter)
    {
        this.Input = input;
        this.Converter = converter;
    }

    public int GetConvertedValue()
    {
        return this.Converter.Convert(this.Input);
    }

}

[编辑] 来自调用代码:

MyClass myClass = new MyClass("abcd",new ASCIConverter());
int intRepresentation = myClass.GetConvertedValue();
于 2013-05-07T15:55:36.877 回答
1

您可以添加一个接受委托并应用于 InputString 的 Transform 方法:

class MyClass
{
  public string InputString { get; private set; }
  public int OutputValue { get; set; }
  public MyClass(string inputString)
  {
    this.InputString = inputString;
  }

  public void Transform(Func<string, int> f){
    OutputValue = f(InputString);
  }
}

MyClass mC = new MyClass("abcd");
mC.Transform(c=> c.Sum(c=> ((int)c));//OutputValue is changed
mC.Transform(c=> (int)c.Average(c=> ((int)c));//OutputValue is changed
于 2013-05-07T15:37:34.617 回答