具有单个部分的部分类/找不到用于实现部分方法声明的定义声明

时间:2018-09-20 07:44:30

标签: c# visual-studio xamarin cross-platform partial-classes

我正在尝试在Forms应用程序的共享项目中实现一个简单的部分类和方法,以与Android和iOs项目一起使用。

所有类都具有相同的名称空间( sharedTest ),并且具有关键字partial,但是Android和iOs文件中的partial类和方法似乎无法识别共享代码中实现的其他部分。

部分类 Shared 表示“具有单个部分的部分类”

Android和iOs文件中的方法 PlatformGetFilePath 引发错误“找不到用于实现部分方法声明的定义声明”

Android和iOs文件中的变量 _filepath 引发“当前方法中不存在”

要进行这项工作,我缺少什么吗?

共享项目中的局部类:

using System;
using Xamarin.Forms;

namespace sharedTest
{
    public partial class Shared
    {
        public Shared()
        {

        }

        partial void PlatformGetFilePath(string filename);
        string _filepath;
        public string GetFilePath(string filename)
        {
            PlatformGetFilePath(filename);
            return _filepath;
        }

    }
}

Android:

using System;
using System.IO;
using Xamarin.Forms;

namespace sharedTest
{
    public partial class Shared
    {
        partial void PlatformGetFilePath(string filename)
        {

           string libraryPath=Environment.GetFolderPath(Environment.SpecialFolder.Personal); ;

            _filepath = Path.Combine(libraryPath, filename);
        }
    }
}

iOs:

using System;
using System.IO;
using Xamarin.Forms;

namespace sharedTest
{
    public partial class Shared 
    {
        partial void PlatformGetFilePath(string filename)
        {

            string documentsPath=Environment.GetFolderPath(Environment.SpecialFolder.Personal); 
            string libraryPath = Path.Combine(documentsPath, "..", "Library");

            _filepath = Path.Combine(libraryPath, filename);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

首先,它不起作用,因为您可以在iOS和Android中使用相同的名称空间。如果要在iOS和Android中执行不同的操作,则可以使用Custom RenderersDependencyService。对于例子

  

表格

...

namespace sharedTest
{

 public class MyClass
  {
    public interface IGetFilePath
    {
        String PlatformGetFilePath(string filename);
    }
  }

}
  

在iOS中

using System;
using System.IO;
using sharedTest;//your xamarin.forms name
using sharedTest.iOS;
using Xamarin.Forms;

[assembly: Dependency(typeof(MyiOSClass))]

namespace sharedTest.iOS
{
    public class MyiOSClass:MyClass.IGetFilePath
    {
        public MyiOSClass()
        {

        }
        public string PlatformGetFilePath(string filename)
        {

         string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
         string libraryPath = Path.Combine(documentsPath, "..", "Library");

         string filepath = Path.Combine(libraryPath, filename);

         return filepath;
        }
    }
}
  

在Android中

using System;
using Xamarin.Forms;
using sharedTest;//your xamarin.forms name
using sharedTest.Droid;
using System.IO;

[assembly: Dependency(typeof(MyAndroidClass)) ]

namespace sharedTest.Droid 
{
    public class MyAndroidClass: MyClass.IGetFilePath
    {
        public MyAndroidClass()
        {

        }

        public string PlatformGetFilePath(string filename)
       {

         string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); ;

         string filepath = Path.Combine(libraryPath, filename);

         return filepath; 
       }
   }
}
  

实施共享代码

var filePath = DependencyService.Get<MyClass.IGetFilePath>().PlatformGetFilePath("your file name"); 

有关更多信息,请参阅here

答案 1 :(得分:0)

这可以完成-但是部分类的共享部分需要在“共享项目”项目类型中定义。

我误以为这个“共享项目”可能是我的Xamarin Forms .net标准类库。不能-“共享项目”一词指的是称为“共享项目”的实际项目类型-不仅指共享的项目。

您需要添加“共享项目”类型的新项目,然后从Xamarin Forms类库和平台特定项目中引用该项目。并且还要确保名称空间与您完成的操作匹配。