【问题标题】:Passing an argument from a string从字符串传递参数
【发布时间】:2018-08-05 23:30:52
【问题描述】:

我是 C# 世界的新手,我正在尝试动态传递参数 所以我在ms Project上做了一个小插件,当数据是持续时间或成本时我需要做一些计算,所以我有很多持续时间字段Duration1,Duration2,......对于成本字段也是如此 所以我所做的很简单,我找到了所有的持续时间 ID,并将它们放在我的 DurationList 中,然后我进行检查,如果我只选择一列并且这个选定列的 ID 在我的列表中,我会选择此字段的名称,我尝试将其作为参数传递
这是我的一段代码,这里我只是在处理持续时间

    using MSProject = Microsoft.Office.Interop.MSProject;
private void Application_WindowSelectionChange(MSProject.Window Window, MSProject.Selection sel, object selType)
        {
    MSProject.Task task = null;
    List <int> DurationList = new List<int> { 188744967,...};
    int value= Int32.Parse(Application.ActiveSelection.FieldIDList[1]);
    Double Cost=0, CostTotal=0;
    if (DurationList.Contains(value)){
    string fieldname= Application.ActiveSelection.FieldName[1];
    for (int i = 1; i <= sel.Tasks.Count; i++)
                {
                    task = sel.Tasks[i];
                    Cost = Convert.ToDouble(task.fieldname); 
                    CostTotal += Cost;       
                }

    }
    }

但是当我尝试这样做时,我收到一条错误消息:“任务”不包含名称的定义,并且找不到接受“任务”类型的第一个参数的扩展方法“名称”。强> 所以我的代码应该做什么,它获取我的字段的名称,它将它存储在我的字段名字符串中,然后我想将此字符串的内容作为我的 task.fieldname 的参数传递。如果我使用与小扳手一起出现的建议字段,例如成本或持续时间,我的代码运行没有问题,但我需要获得更多动态 有什么想法吗?

谢谢

【问题讨论】:

  • 我很抱歉,但在阅读了您的帖子后,我的大脑感觉就像意大利面条......您正在尝试做什么以及您的问题到底是什么非常令人困惑。您发布的错误消息说您正在尝试访问 Task 类的成员 name,但我在您发布的代码中没有看到它。请发布一个可以复制粘贴的完整示例。请尝试更连贯地描述您的目标
  • 假设Task是一个类,那么你需要创建一个名为Name的属性/方法,然后调用Convert.ToDouble(task.Name);
  • 尝试包含更多代码。任务变量是什么类型?你想达到什么目的?您的问题将得到更快的答复。 ;)
  • 这样更好,但我们仍然需要更多信息。 sel 变量是什么?它在哪里声明,等等。此外,这是编译器错误还是运行时异常?如果是编译器错误,编译器警告你的行号是多少?
  • Task has a Name property,这就是你的意思而不是fieldname

标签: c# arguments


【解决方案1】:

我不确定您要做什么。你能用不同的方式解释你的意图吗?

以下是我注意到的一些事情:

您不能在同一行中声明和使用“+=”运算符。因为“+=”是给左边已经初始化的变量加值的简写。

即:x += 2; 等价于 x = x + 2;因此 x 必须在您使用 += 运算符时对其进行初始化(具有当前值)。当你说double x += anyValue; 时,实际上意味着x = x + anyValuex 还没有值。

至于string argument = "Duration";,您是否将其替换为代表有效双重文字的字符串,即:1.66?我猜你是。

如果没有看到 Task 类定义,我无法确定发生了什么,但我认为 argument 不是 Task 的实例成员。

【讨论】:

  • 我在更新代码之前发布了此内容,如果现在没有意义,请见谅。
  • 这应该是一条评论。
  • 我发布此代码时,他的代码大不相同。它看起来不像这样。
  • 没关系。关键是这个答案实际上并没有回答任何问题。它指出了应该如何改进问题,这就是 cmets 的用途。
  • 它指出代码中的缺陷并尝试回答并要求改进的答案。我无法评论。根据前面的代码示例,唯一的错误可能是用户没有在类定义中创建该字段。之前的代码大概有 2 行长。
【解决方案2】:

如果我终于明白了,这就是你如何获得名为“fieldname”的 Task 属性的值:

task = sel.Tasks[i];
var valueofFieldName = task.GetType().GetProperty(fieldname).GetValue(task, null);
Cost = Convert.ToDouble(valueofFieldName); 
CostTotal += Cost;  

【讨论】:

  • 谢谢,它正在工作,但我有一个新的错误消息:附加信息:对象引用未设置为对象的实例。
  • @freedumz 那里有失败的机会。我给了你最好的场景代码。您应该检查 null 并捕获不能转换为 Double 的值。
  • 试试task = sel?.Tasks[i];
猜你喜欢
  • 2018-11-17
  • 2014-08-06
  • 1970-01-01
  • 2013-07-26
  • 2011-05-12
  • 1970-01-01
  • 2017-05-02
  • 2016-03-16
  • 1970-01-01
相关资源
最近更新 更多