【问题标题】:C# Tuple. Does not contain a definition for Item1C#元组。不包含 Item1 的定义
【发布时间】:2014-05-18 08:19:14
【问题描述】:
class WakeUP
{
    [DllImport("kernel32.dll")]
    public static extern SafeWaitHandle CreateWaitableTimer(IntPtr lpTimerAttributes, 
                                                              bool bManualReset,
                                                            string lpTimerName);

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool SetWaitableTimer(SafeWaitHandle hTimer, 
                                                [In] ref long pDueTime, 
                                                          int lPeriod,
                                                       IntPtr pfnCompletionRoutine, 
                                                       IntPtr lpArgToCompletionRoutine, 
                                                         bool fResume);

    public event EventHandler Woken;

    private BackgroundWorker bgWorker = new BackgroundWorker();

    public WakeUP()
    {
        bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
        bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
    }

    public void SetWakeUpTime(DateTime time, String tName)
    {
        // Create a 7-tuple. 
        var wutargs = new Tuple<string, string>(time.ToFileTime().ToString(), tName.ToString()); 
        bgWorker.RunWorkerAsync(wutargs);
    }

    void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (Woken != null)
        {
            Woken(this, new EventArgs());
        }
    }

    private void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
    {
        var thetuple = e.Argument;
        long wakeuptime = (long)thetuple.Item1;

        using (SafeWaitHandle handle = CreateWaitableTimer(IntPtr.Zero, true, "Timer"))
        {
            //if (SetWaitableTimer(handle, ref "12:00 AM", 0, IntPtr.Zero, IntPtr.Zero, true))
            //{
                //using (EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset))
                //{
                    //wh.SafeWaitHandle = handle;
                    //wh.WaitOne();
                //}
            //}
            //else
            //{
                //throw new Win32Exception(Marshal.GetLastWin32Error());
            //}
        }
    }

Visual Studio 告诉我:

        long wakeuptime = (long)thetuple.Item1;

错误 1 ​​'object' 不包含 'Item1' 的定义,并且找不到接受“object”类型的第一个参数的扩展方法 'Item1'(您是否缺少 using 指令或程序集引用?) C :\Users\esepich\Documents\Visual Studio 2013\Projects\SepysAlarmV1ecs\SepysAlarmV1\WakeUP.cs 57 46 SepysAlarmV1

我应该如何访问元组的元素?

感谢您发布...

【问题讨论】:

  • 您应该使用 TPL (await Task.Run()) 而不是 BackgroundWorker。

标签: c# tuples


【解决方案1】:

参数可以是 any 类型。它作为object 传递,因此将其转换回原始类型:

var thetuple = (Tuple<string, string>)e.Argument;

下一行也会出现编译器错误:

long wakeuptime = (long)thetuple.Item1;

考虑使用Convert.ToInt64Int64.TryParse

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多