C# 无法将InputEventArgs强制转换为MouseeEventArgs

C# 无法将InputEventArgs强制转换为MouseeEventArgs,c#,casting,extension-methods,C#,Casting,Extension Methods,我正在尝试使用这种扩展方法。在强制转换中出现错误,说明“无法将类型T转换为MouseEventArgs”。我是否应该能够向上投射对象(因为MouseEventArgs:InputEventArgs) 如果您好奇的话,我将使用它在鼠标和触摸事件之间共享事件处理程序,只需使用处理程序方法中的基本InputEventArgs public static class InputEventArgsExtensions { public static Point GetPos

我正在尝试使用这种扩展方法。在强制转换中出现错误,说明“无法将类型T转换为MouseEventArgs”。我是否应该能够向上投射对象(因为
MouseEventArgs:InputEventArgs

如果您好奇的话,我将使用它在鼠标和触摸事件之间共享事件处理程序,只需使用处理程序方法中的基本InputEventArgs

    public static class InputEventArgsExtensions
    {
        public static Point GetPosition<T>(this T e, IInputElement obj)
            where T : InputEventArgs
        {
            if (e is MouseEventArgs)
                return ((MouseEventArgs)e).GetPosition(obj);
            else if (e is TouchEventArgs)
                return ((TouchEventArgs)e).GetTouchPoint(obj).Position;

            return new Point();
        }
    }
public静态类inputEventArgsExtrains
{
公共静态点GetPosition(此T e,IIInputElement obj)
其中T:InputEventArgs
{
如果(e是MouseEventArgs)
返回((MouseEventArgs)e).GetPosition(obj);
else if(e是TouchEventArgs)
返回((TouchEventArgs)e.GetTouchPoint(obj.Position);
返回新点();
}
}

如果e总是从InputEventArgs派生,那么只需使用该类型而不是通用方法:

public static Point GetPosition(this InputEventArgs e, IInputElement obj)
{
    // Code here   
}

我试着这样做,它对我起了作用

    public static class InputEventArgsExtensions
    {
        public static Point GetPosition<T>(this T e, IInputElement obj)
            where T : InputEventArgs
        {
            if (e is MouseEventArgs)
                return (e as MouseEventArgs).GetPosition(obj);
            else if (e is TouchEventArgs)
                return (e as TouchEventArgs).GetTouchPoint(obj).Position;

            return new Point();
        }
    }
public静态类inputEventArgsExtrains
{
公共静态点GetPosition(此T e,IIInputElement obj)
其中T:InputEventArgs
{
如果(e是MouseEventArgs)
返回(e为MouseEventArgs)。获取位置(obj);
else if(e是TouchEventArgs)
返回(e作为TouchEventArgs.GetTouchPoint(obj.Position);
返回新点();
}
}

MouseEventArgs
已经有了方法。因此,我认为您可能只想扩展
TouchEventArgs

public static Point GetPosition(this TouchEventArgs e, IInputElement relativeTo)
{
    e.GetTouchPoint(obj).Position;
}

啊,很好的理解。不幸的是,糟糕的名字选择并不能解决问题;是的,我在意识到它没有引起问题后删除了该注释。查看此链接:那么,当它是
MouseEventArgs
时,是什么阻止它进入无限递归?@Servy我猜非扩展方法有某种优先级?我可以告诉你,它不是无限递归的。也许,但我使用扩展方法的代码中的点只有InputEventArgs类型。顺便说一句,还有StylusEventArgs,你可能应该考虑一下。谢谢你的提醒,如果我现在不这么做的话,它无疑会在我未来的某个时候成为一个bug报告。