Частичный класс с единственной частью / Не найдено определяющего объявления для реализации объявления частичного метода - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь реализовать простой частичный класс и метод в общем проекте в приложении Forms для работы с проектами Android и iOs.

Все классы имеют одинаковое пространство имен ( sharedTest ) и имеют ключевое слово частичное, но частичные классы и методы в файлах Android и iOs, похоже, не распознают другую часть, реализованную в Shared.code.

Частичный класс Shared говорит «частичный класс с одной частью»

Метод PlatformGetFilePath в файлах Android и iOs выдает ошибку«Не найдено определяющего объявления для реализации объявления частичного метода»

Переменная _filepath в файлах Android и iOs «не существует в текущем методе» *

isЕсть что-нибудь, что мне не хватает, чтобы сделать эту работу?

Частичный класс в проекте Shared:

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);
        }
    }
}

1 Ответ

0 голосов
/ 21 сентября 2018

Во-первых, он не будет работать, потому что вы можете использовать одно и то же пространство имен как в iOS, так и в Android. Если вы хотите делать разные вещи в iOS и Android, вы можете использовать Custom Renderers или DependencyService. Например,

в формах

...

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"); 

Для получения дополнительной информации вы можете обратиться к здесь

...