1

我正在开发一个 Windows Phone 应用程序,并将其定位到 7.1,因此它可以在 wp7 和 wp8 设备上运行。如果应用程序在 wp8 设备上运行,我想运行以下代码:

public async void DefaultLaunch2a()
{
    // Path to the file in the app package to launch
    var file1 = await ApplicationData
        .Current
        .LocalFolder
        .GetFileAsync("webcam-file.jpg");

    if (file1 != null)
    {
        // Launch the retrieved file
        var success = await Windows.System.Launcher.LaunchFileAsync(file1);

        if (success)
        {
            // File launched/y
        }
        else
        {
            // File launched/n
        }
    }
    else
    {
       // Could not find file
    }
}

启动器文件类型(打开图像)。我正在尝试通过反思来做到这一点,但我遇到了一些问题。

String name = "file1.jpg";
Type taskDataType2 = Type.GetType("Windows.Storage.StorageFolder, Windows, "
                                  + "Version=255.255.255.255, Culture=neutral, "
                                  + "PublicKeyToken=null, "
                                  + "ContentType=WindowsRuntime");

MethodInfo showmethod2 = taskDataType2.GetMethod("GetFileAsync", 
                                                 new Type[] 
                                                 { 
                                                     typeof(System.String) 
                                                 });
showmethod2.Invoke(taskDataType2, 
                   new System.String[] { name });

此代码引发异常TargetException: Object does not match target type - 当我调用该方法时。

怎么了?有没有人已经尝试使用反射编写上面的代码?目标是从设备商店读取图像文件,然后启动Windows.System.Launcher.LaunchFileAsync. 如果代码在 wp8 设备上运行,我想做类似 mangopollo 的事情。

4

1 回答 1

1

问题在于,您应该在实例上调用该方法,而taskDataType2不是在表示该类型的对象上调用该方法。taskDataType2不是 的实例Windows.Storage.StorageFolder,它是Type类型的实例。尝试这样的事情:

Type taskDataType2
    = Type.GetType("Windows.Storage.StorageFolder, Windows,"
                   + " Version=255.255.255.255, Culture=neutral,"
                   + " PublicKeyToken=null, ContentType=WindowsRuntime");

MethodInfo showmethod2 = taskDataType2
    .GetMethod("GetFileAsync", new[] { typeof(string) });

object taskDataInstance = taskDataType2
    .GetConstructor(Type.EmptyTypes)
    .Invoke(null);    

String name = "file1.jpg";
showmethod2.Invoke(taskDataInstance, new[] { name });

这被简化为可以使用无参数构造函数实例化类型的情况。否则,您应该GetConstructor使用适当的参数而不是Type.EmptyTypes.

请注意,这不是检索实例的推荐方法:StorageFolder

通常,您访问StorageFolder对象是异步方法和/或函数调用的结果。例如,静态方法GetFolderFromPathAsync返回StorageFolder表示指定文件夹的 a。

于 2013-10-17T11:33:40.603 回答