2016-01-22 43 views
0

我正在构建一个函数来减少18个按钮的相同代码。'object'不包含'value'

下面是代码:

void hexagon_Click(object sender, ActionEventArgs e) 
    { 
     count++; 
     this.Dispatcher.Invoke((Action)(() => 
     { 
      sender.RectOne.Fill = sender.Brush; 
      sender.RectTwo.Fill = sender.Brush; 
      sender.RectThree.Fill = sender.Brush; 
     })); 
     if (count == 1) 
     { 
      kliknatopole = sender; 
     } 
     else if (count == 2) 
     { 
      if (kliknatopole == sender) 
      { 
       return; 
      } 
      else 
      { 
       if (kliknatopole.Brush == sender.brush) 
       { 
        levelUpControUI(level); 
        prepareForNextLevel(); 
        nextLevel1(); 
        count = 0; 
        sender.Enabled = false; 
        kliknatopole.Enabled = false; 
       } 
       else 
       { 
        this.Dispatcher.Invoke((Action)(() => 
        { 
         sender.RectOne.Fill = sender.Brush; 
         sender.RectTwo.Fill = sender.Brush; 
         sender.RectThree.Fill = sender.Brush; 
        })); 
        Thread.Sleep(500); 
        this.Dispatcher.Invoke((Action)(() => 
        { 
         sender.RectOne.Fill = Brushes.Transparent; 
         sender.RectTwo.Fill = Brushes.Transparent; 
         sender.RectThree.Fill = Brushes.Transparent; 
         kliknatopole.RectOne.Fill = Brushes.Transparent; 
         kliknatopole.RectTwo.Fill = Brushes.Transparent; 
         kliknatopole.RectThree.Fill = Brushes.Transparent; 
        })); 
        toLevelOne(); 
        count = 0; 
       } 
      } 
     } 
    } 

现在我也不知道为什么,但kliknatopole这是一个private objectsender不能从类HexagonControl访问的价值观,那就是:

public partial class HexagonControl : UserControl 
{ 
    public BaseControlLogic controlLogic { get; set; } 
    public HexagonControl() 
    { 
     InitializeComponent(); 
     controlLogic = new BaseControlLogic(); 
    } 

    public Rectangle RectOne { get { return rectOne; } } 
    public Rectangle RectTwo { get { return rectTwo; } } 
    public Rectangle RectThree { get { return rectThree; } } 
    public Brush Brush { set; get; } 
} 

对于RectOne,Two and Three,也Brush,我得到这个错误:

'object' does not contain a definition for 'RectOne' and no extension method 'RectOne' accepting a first argument of of type 'object' could be found

我把HexagonControl公开,但这并没有解决它。我还试图建立一个object和传递sender值,但仍然didnt修复它,它只是给了我这个Cannot implicitly convert type 'object' to 'LongName.HexagonControl'. An explicit conversion exists

什么可能会造成这个错误,我怎么能解决这个问题。

+7

你必须将'sender'转换为其原始类型 –

+0

@FlatEric这应该是一个答案而不是评论 – Ermiar

+0

在我的情况下,该怎么做。我是新来的C#,对不起 –

回答

2

你要投senderHexagonControl型或发送它的价值另一个HexaControl类型变量。请尝试以下操作:

void hexagon_Click(object sender, ActionEventArgs e) 
{ 
    if(sender.GetType() != typeof(HexagonControl)) 
      return; 
    count++; 
    HexagonControl realSender = (HexagonControl) sender; 

    [...] 

而且在方法的其余部分使用realSender代替sender。这样,如果sender不是HexagonControl,则可以防止Exception,只是为了防范。

希望它有帮助!

+0

发件人部分得到修复,但现在我得到这个:操作员!不能应用于'System.Type'类型的操作数 –

+0

@Xy。尝试更改if行:'if(sender.GetType()!= typeof(HexagonControl))',我犯了一个错误,已经编辑了答案,对此抱歉。 –

+0

是的,都很好。这解决了它 –

2

只投sender其原始类型:

((HexagonControl)sender).RectOne.Fill = ((HexagonControl)sender).Brush; 

当然,你必须对其他8个用法也这么做

+0

不解决它。 –

+0

@Xy你是否已经为*所有使用'sender'的情况做过? –

+0

是的,但我仍然得到相同的错误 –

相关问题