【问题标题】:Using an unkown method based on what object is selected in the dictionary根据在字典中选择的对象使用未知方法
【发布时间】:2011-05-16 03:47:02
【问题描述】:

我目前完成了我的构建脚本,并开始进行一些 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(布尔运算符)。

我很确定我必须匿名和代表,但我不知道该怎么做。我将不胜感激。

【问题讨论】:

  • 你能提供更多的上下文吗?这段代码应该解决的实际问题是什么?
  • 啊,是的,这很模糊。我想使用字典中列出的类中的方法。但是由于我不知道我会得到哪个类,所以我不知道要调用哪个方法名。这就是我要解决的问题。

标签: c# dictionary object


【解决方案1】:

如前所述,接口或继承是解决此问题的首选方法。

如果由于某种原因您不能使用它们,那么您需要反思。 (对不起,我是一个 VB 程序员,所以我的 c# 语法可能是错误的,但希望你能明白)

对象 o = 要操作的对象
MethodInfo m = typeof(o).GetMethod("要调用的方法名");
m.Invoke(o);

【讨论】:

    【解决方案2】:

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

    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 或其他任何东西,并调用其各自的方法。

    【讨论】:

    • 这是一个很好的方法,虽然接口可能是更好的方法。
    • 视情况而定。如果对象是相关的并且具有共同的功能,那么基类就是要走的路。如果它们不是,也不是,那么接口是更好的选择。
    • 这正是我所需要的,感谢大家的帮助,感谢 Mike Caron 的解决方案。今年早些时候,我在 Java 中学习了接口和抽象类,但几乎都忘记了。这是可悲的,这些正是我所需要的。顺便说一句,因为它们共享共同的功能,所以最可能使用抽象类。再次感谢所有快速帮助。
    • @Siemsen: :D 这是我们的荣幸
    【解决方案3】:

    也许新的 Func() 会有所帮助? http://tekpub.com/view/concepts/2

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      相关资源
      最近更新 更多