根据字典中选择的对象使用未知方法

时间:2010-11-26 11:38:53

标签: c# dictionary object

我目前已经完成了构建脚本,并且已经开始进行一些C#编程。

这就是我所拥有的:

public bool resultOfOperation(bool firstOperator, bool secondOperator, string operation)
        {
            //The bool value in the dictionary is gotten by used the corresponding operation method in the operation class.
            Dictionary<string, bool> mappedObjects = new Dictionary<string, bool>();
            mappedObjects.Add("OR", new OrOperator().operationOR(firstOperator,secondOperator));

            foreach (KeyValuePair<string, bool>  keyAndValue in mappedObjects)
            {
                if (keyAndValue.Key == operation.ToUpper())
                    return keyAndValue.Value;
            }

            throw new ArgumentException("Something has gone very wrong.");
        }

虽然这有效,但我想做点其他事情。我希望字典能够保存字符串和对象。然后我想根据我提供对象的方法使用正确的对象。

示例(不起作用)

Dictionary<string, object> test = new Dictionary<string, object>();
            foreach (KeyValuePair<string, object> keyAndValue in test)
            {
                if(keyAndValue.Key == "SomethingValue")
                    keyAndValue.Value.USE METHOD OF CLASS HERE;
            }

我应该提到所有类都有类似的方法,例如bool FUNCTIONname(bool运算符)。

我相当肯定我有匿名和代表,但我不知道如何。我很感激任何帮助。

3 个答案:

答案 0 :(得分:1)

您应该使用相同的方法名称,而不是使用唯一的方法名称,并利用类型系统来获得优势!例如:

abstract class Operation {
    public abstract bool DoOperation(bool left, bool right);
}

class OrOperation {
    public override bool DoOperation(bool left, bool right) {
        return left || right;
    }
}

class DoOperationStuff {
    Dictionary<string, Operation> mappedObjects = new Dictionary<string, Operation>() {
        {"OR", new OrOperation()}
    };

    public bool resultOfOperation(bool left, bool right, string operation) {
        if(mappedObjects.ContainsKey(operation)) {
            return mappedObjects[operation].DoOperation(left, right);
        }

        throw new ArgumentException("Something has gone very wrong.");
    }
}

这应该是相当的解释,但是:

  • 抽象类是不能直接实例化的类,但是要由其他类继承。
  • 抽象(和虚拟)方法是旨在在继承的类中重写的方法。
  • 因为DoOperation被标记为抽象,所以程序知道要查看对象的真实类型,以便知道要调用的内容。
  • 因此,即使程序有一堆Operation个对象,每个对象实际上都是OrOperation或其他任何对象,并且会调用其各自的方法。

答案 1 :(得分:1)

正如已经提到的,接口或继承是解决此问题的首选方法。

如果由于某种原因你无法使用它们,那么你需要反思。 (对不起,我是VB程序员,所以我的c#语法可能有问题,希望你能得到这个想法)

对象o =要操作的对象
MethodInfo m = typeof(o)。GetMethod(“Call Name to Call”);
m.Invoke(O);

答案 2 :(得分:0)

也许新的Func&lt;&gt;()可能会有所帮助? http://tekpub.com/view/concepts/2