Xamarin DependencyService: System.MissingMethodException: конструктор по умолчанию не найден для [Интерфейс]

Я получаю эту ошибку при использовании службы зависимостей на Xamarin.Forms PCL. Я видел ответы на эту ошибку, связанные с iOS и Linker. Однако я использую это на Android, а Linker выключен. Также режим отладки.

Конструктор, о котором он сообщает, не может найти конструктор по умолчанию для интерфейса в PCL.

Я подумал, что это может быть проблема с некоторым переименованием, которое я сделал (я использовал инструмент рефакторинга и убедился, что все необходимые изменения были внесены), поэтому я удалил эти папки / файлы и переделал их. Еще ничего :(

Я искал и отлаживал это несколько часов. Что может вызывать эту ошибку? Я почти уверен, что мои DependencyService реализации верны, поэтому я чувствую, что это что-то другое.

Вот мой связанный код.

Интерфейс:

namespace Enchantum.Functions
{
public interface PaymentProcessor
{

    void setUpCard(String cardNumber,
        int expirationMonth,
        int expirationYear,
        String CVC);

    Task cardTokenizer();

    void backendCardCharge();

}

Android:

[assembly: Xamarin.Forms.Dependency(typeof(PaymentProcessor_Android))]

namespace Enchantum.Droid.Functions_Android
{
class PaymentProcessor_Android : PaymentProcessor
{
public PaymentProcessor_Android() { }

    private Card mCard;
    private Token mToken;

    public void setUpCard(String cardNumber, int expirationMonth,
        int expirationYear, String cvcCode)
    {
        Card card = new Card
        {
            Number = cardNumber,
            ExpiryMonth = expirationMonth,
            ExpiryYear = expirationYear,
            CVC = cvcCode
        };

        mCard = card;
    }

    public async Task cardTokenizer()
    {
        mToken = await StripeClient.CreateToken(mCard);
    }

    /*TODO: 
     * */

    public void backendCardCharge()
    {
        throw new NotImplementedException();
    }

iOS:

[assembly: Xamarin.Forms.Dependency(typeof(PaymentProcessor_iOS))]

namespace Enchantum.iOS.Functions_iOS
{
class PaymentProcessor_iOS : PaymentProcessor
{
public PaymentProcessor_iOS() { }

    private Card mCard;
    private Token mToken;

    public void setUpCard(String cardNumber, int expirationMonth,
        int expirationYear, String cvcCode)
    {
        Card card = new Card
        {
            Number = cardNumber,
            ExpiryMonth = expirationMonth,
            ExpiryYear = expirationYear,
            CVC = cvcCode
        };

        mCard = card;

    }

    public async Task cardTokenizer()
    {
        mToken = await StripeClient.CreateToken(mCard);
    }

    /*TODO:*/
    public void backendCardCharge()
    {
        throw new NotImplementedException();
    }




}

Реализация на странице содержимого Xamarin.Form:

DependencyService.Get<PaymentProcessor>().setUpCard(
                    cardNumber,
                    expirationMonth,
                    expirationYear,
                    CVC);

Еще раз моя ошибка: «System.MissingMethodException: конструктор по умолчанию не найден для типа Enchantum.Functions.PaymentProcessor»

Что не так?

P.S. Прошу прощения за неправильное соглашение об именах для интерфейса, а также за какой-то другой беспорядок.


person eeastwood    schedule 13.07.2016    source источник


Ответы (4)


Может быть, вы можете попробовать создать классы реализации интерфейса public, ваши конструкторы будут видимыми, но сам класс может быть не виден.

Так нравится:

[assembly: Xamarin.Forms.Dependency(typeof(PaymentProcessor_Android))]

namespace Enchantum.Droid.Functions_Android
{
public class PaymentProcessor_Android : PaymentProcessor //make the class public
{

 //your code here

 }
}
person Ravi L    schedule 13.07.2016
comment
Для всех, кто сталкивается с этим и задается вопросом, почему ваш код кажется не совсем правильным. Определение зависимости должно включать текущий класс, PaymentProcessor_Android не интерфейс, PaymentProcessor. - person Brad Moore; 23.10.2016
comment
Как и в приведенном выше примере, моя ошибка заключалась в том, чтобы написать [assembly: Xamarin.Forms.Dependency(typeof(PaymentProcessor))], и я получаю ту же ошибку. - person Enrico; 21.03.2017
comment
В моем случае конструктор был защищен, и изменение его на общедоступное помогло! - person chaosifier; 14.07.2018
comment
Какое-то время я чесал в затылке, но эта строка очень важна. Я не знаю, требуется ли эта строка для всех распознавателей, поэтому она могла быть пропущена мной, но для Xamarin Forms она нужна. - person Chucky; 07.09.2018
comment
@BradMoore - Правильный ответ для меня ... Был интерфейс вместо класса. После изменения все заработало, как ожидалось. Спасибо. - person Thierry; 30.12.2018
comment
Итак, у меня было сочетание имени интерфейса в аргументе assembly: Xamarin.Forms.Dependency, которое у вас должно быть имя класса. Кроме того, наличие конструктора, определенного в классе public PaymentProccessor_Android() {}, также вызывает проблему, потому что интерфейс не имеет этого конструктора, определенного в нем. - person shreddish; 14.08.2020

В моем случае проблема была в строке экспорта сборки.
Приложение вылетало из-за того, что я использовал тип интерфейса вместо реализации класса:
[assembly: Xamarin.Forms.Dependency(typeof(IServiceType))]

Но правильный способ - использовать зависящую от платформы реализацию интерфейса:
[assembly: Xamarin.Forms.Dependency(typeof(ServiceImplementation_Android))]

person Dr TJ    schedule 08.03.2019

У меня такая же проблема для Linker, когда я устанавливаю Linker на None, он работает

person Mina Fawzy    schedule 29.11.2017

Я получал ту же ошибку, когда определял конструктор по умолчанию, который инициализировал частное свойство только для чтения.

Казалось сумасшедшим, но это имеет смысл, учитывая, что в Java нет концепции readonly, и свойство, вероятно, перенесено в константу.

person MSC    schedule 10.07.2017