2011-08-16 3 views
0

대리자를 참조하기 위해 사전을 사용하려고하는데 위임 포인터를 가져 오려고 시도 할 때 오류가 발생합니다. 더 많은 문맥에 대해 C 구조체의 값을 검색하는 데 사용할 문자열이 제공되고 있습니다. C 구조체에서 데이터를 가져 오거나 설정하는 메서드를 작성했지만 이제는 문자열이 주어진 메서드를 호출해야합니다. 네가 더 좋은 길을 알고 있다면 나에게 알려줘.iDictionary에서 반환 된 대리인을 얻으려면 어떻게해야합니까?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace TestCode 
{ 
    public class tuboFillLinePresets 
    { 
     public IDictionary<string, object> DBLookup { get; set; } 
     public config_data Data; 

     delegate float MyDel(int chan); 

     public float ChanGain(int chan) 
     { 
      return Data.ChannelGain(chan); 
     } 

     public float MagCurr(int chan) 
     { 
      return Data.MagCurrent(chan); 
     } 

     public tuboFillLinePresets() 
     { 
      DBLookup = new Dictionary<string, object>(); 
      MyDel cg = new MyDel(ChanGain); 
      MyDel mc = new MyDel(MagCurr); 
      DBLookup.Add("HBGain", cg); 
      DBLookup.Add("LBGain", cg); 
      DBLookup.Add("MagCurrent", mc); 
     } 

     public LinePresets tuboGetLinePresets(LinePresets LinePresets) 
     { 
      foreach (var item in LinePresets.Parameters) 
      { 
       String s = item.Key; 
       MyDel func; 
       DBLookup.TryGetValue(s, out func); // error here 
       LinePresets.Parameters[s] = func(3); 
      } 
      return LinePresets; 
     } 
    } 
} 
+0

무엇이 오류입니까? –

답변

6

귀하의 DBLookup 필드는 Dictionary<string, MyDel>해야한다. 이렇게하면 값을 가져올 때 반환되는 형식은 object이 아닌 MyDel이됩니다.

out 인수로 전달한 참조 유형이 정확히 유형과 일치해야하기 때문에 오류가 발생합니다. out 인수의 유형은 MyDel이고 TryGetValue의 매개 변수는 object (사전의 값 유형이므로) 오류이므로 오류가 발생합니다. 위의 변경을하면 인수의 유형이 매개 변수의 유형과 일치하며 오류 메시지가 사라집니다.

일반적으로 object 값을 보유하는 사전을 선언하는 경우 실제로 저장할 내용을 고려하고 대신 다른 형식을 사용할 수 있는지 확인하십시오.

1

귀하의 사전 저장 objects, MyDel 아닌 경우 ...

public IDictionary<string, MyDel> DBLookup { get; set; } 

로 사전을 정의하고 그에 따라 코드의 나머지 부분을 변경합니다. 이 작업을 수행하는 것은 전적으로 가능한 것 때문에 :

DBLookup.Add("foo", "HAH!"); 

컴파일러는 사전에 저장할 수있는 모든 값을 물을 수 없습니다 out 등의 변수를 전달하지 않습니다. 당신은 두 가지 선택이 있습니다

    Dictionary<string, MyDel>에 사전을 변경
  • (이것은 최선의 선택을하는 경우 문자열 키 MyDel의 사전 정말에만 저장 인스턴스)
  • 를 사용하여 검색을 위해 중간 변수

과 같이 :

object value; 

if(DBLookup.TryGetValue(s, out value) && value is MyDel) 
{ 
    func = (MyDel)value; 
    LingPresents.Parameters[s] = func(3) 
} 
0

아니면 TryGetValue에 사전에 값과 같은 개체 유형을 필요로하는 경우 먼저 OBJE를 사용 ct 값을 가져오고 캐스트 한 후에는 반드시 위임 유형을 검색해야합니다.

관련 문제