web-dev-qa-db-fra.com

Xamarin DependencyService: System.MissingMethodException: constructeur par défaut introuvable pour [Interface]

Je reçois cette erreur lorsque j'utilise le service de dépendance sur un Xamarin.Forms PCL. J'ai vu des réponses à cette erreur impliquant iOS et la Linker. Cependant, j'utilise cette fonction sur Android et la Linker est désactivée. Le mode de débogage aussi.

Le constructeur me dit qu'il ne trouve pas le constructeur par défaut pour l'interface dans le PCL.

J'ai pensé que c'était peut-être un problème avec certains changements de nom que j'ai faits (j'ai utilisé l'outil de refactorisation et je me suis assuré que toutes les modifications nécessaires étaient apportées), alors j'ai supprimé ces dossiers/fichiers et les ai refaits. Toujours rien :(

J'ai cherché et débogué cela pendant des heures. Quelles sont les causes possibles de cette erreur? Je suis à peu près sûr que ma DependencyService implémentations est correcte, donc je sens que c'est quelque chose de différent. 

Voici mon code associé.

Interface:

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




}

Implémentation dans une page de contenu Xamarin.Form:

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

Mon erreur, encore une fois: "System.MissingMethodException: constructeur par défaut introuvable pour le type Enchantum.Functions.PaymentProcessor"

Qu'est-ce qui ne va pas?

P.S. Pardonnez ma convention de dénomination incorrecte pour l'interface ainsi que quelques autres dégâts. 

14
eeastwood

Vous pouvez peut-être essayer de rendre vos classes d'implémentation d'interface public, vos constructeurs sont visibles, mais la classe elle-même pourrait ne pas l'être. 

Donc, comme:

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

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

 //your code here

 }
}
9
MangoBoy

J'ai le même problème pour Linker, quand je règle Linker sur Aucun, il fonctionne 

3
Mina Fawzy

J'obtenais la même erreur lorsque j'ai défini un constructeur par défaut qui a initialisé une propriété readonly private. 

Cela semblait fou, mais cela a du sens étant donné que Java n’a pas de concept en lecture seule, et que la propriété s’est probablement transformée en constante.

0
MSC