簡體   English   中英

為方法參數賦值

[英]Assign value to method parameter

想象一下具有以下簽名的方法:

public void ExampleMethod(string id, object data, 
                          ref object A, ref object B, ref object C)
{
  //...
}

data的值需要分配給ABC或什么都不需要,具體取決於id的值。 簡而言之,如果id == "A"A = data;

問題是這個方法的主體是由人類輸入的,但簽名是在運行時生成的。 因此,不可能對邏輯進行硬編碼,因為在設計時未知有多少參考參數以及它們被稱為什么。 這段代碼可以插入到任意數量的方法中,每個方法可能具有不同的簽名,並且它必須在每個方法中工作。

我知道如何獲取當前方法的所有參數,但我無法弄清楚如何為這些參數中的一個賦值。 我正在尋找的是如下:

public void ExampleMethod(string id, object data, 
                          ref object A, ???????, ref object Z)
{
  MethodBase method = MethodBase.GetCurrentMethod();
  foreach (ParameterInfo parameter in method.GetParameters())
  { 
    if (id == parameter.Name)
    {
      // Problem: assign data to parameter.
      return;
    }
  }
}

您無法按名稱訪問參數,因為您無法真正使用變量/參數的反射。 如果這是IL,你可能有一些選擇,但在C#中卻沒有。 我的建議是:更改API,可能涉及數組或(可能更好)字典。 考慮:

public void ExampleMethod(string id, object data,
        IDictionary<string,object> args) {
    args[id] = data;
}

不確定這是否有幫助......但你想要做的事情並不是真正反映友好的。 另一種選擇是動態生成此方法,作為構建過程的一部分,或通過IL生成。 要么應該沒事。 所以它本質上可以生成(作為C#或(在運行時)IL):

public void ExampleMethod(string id, object data, 
                          ref object A, ref object B, ref object C)
{
    switch(id) {
        case "A": A = data; break;
        case "B": B = data; break;
        case "C": C = data; break;
        default: /* do something */
    }
}

另一種方法:鍵入的對象:說你有:

public void ExampleMethod(string id, object data, SomeType obj) {...}

其中obj是具有諸如“A”,“B”,“C”等屬性的對象; 然后你想要生成的是:

switch(id) {
    case "A": obj.A = data; break;
    case "B": obj.B = data; break;
    case "C": obj.C = data; break;
    default: /* do something */
}

這當然可以用反射來完成:

var prop = obj.GetType().GetProperty(id);
prop.SetValue(obj, data, null);

或者如果性能至關重要,那就像快速成員

var wrapped = ObjectAccessor.Create(obj); 
wrapped[id] = data;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM