web-dev-qa-db-ja.com

Xamarin DependencyService:System.MissingMethodException:[インターフェイス]の既定のコンストラクターが見つかりません

Xamarin.Forms PCLで依存サービスを使用すると、このエラーが発生します。 iOSLinkerを含むこのエラーへの回答を見てきました。ただし、これはAndroidで実行しており、Linkerはオフになっています。デバッグモードも同様です。

PCLでインターフェイスのデフォルトコンストラクターを見つけることができないと言われているコンストラクター

私が行ったいくつかの名前変更に問題があるのではないかと思ったので(リファクタリングツールを使用して、必要なすべての変更が行われていることを確認しました)、これらのフォルダー/ファイルを削除して、作り直しました。まだ何もない:(

私は何時間もこれを検索してデバッグしてきました。このエラーの原因となる可能性があるものは何ですか?私のDependencyServiceの実装は正しいと確信しているので、何か違うように感じます。

これが私の関連コードです。

インターフェース:

namespace Enchantum.Functions
{
public interface PaymentProcessor
{

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

    Task cardTokenizer();

    void backendCardCharge();

}

アンドロイド:

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

My error、again: "System.MissingMethodException:Defaultコンストラクタnot found for type Enchantum.Functions.PaymentProcessor"

何が問題になっていますか?

P.S。インターフェースの不適切な命名規則やその他の混乱を許してください。

21
eeastwood

おそらく、インターフェース実装クラスを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

 }
}
11
MangoBoy

私の場合、問題はアセンブリの輸出ラインにありました。
クラスの実装の代わりにインターフェイスタイプを使用したため、アプリがクラッシュしました:
[Assembly: Xamarin.Forms.Dependency(typeof(IServiceType))]

しかし正しい方法は、インターフェイスのプラットフォーム固有実装を使用することです。
[Assembly: Xamarin.Forms.Dependency(typeof(ServiceImplementation_Android))]

5
Dr TJ

リンカーにも同じ問題がありますが、リンカーをなしに設定すると機能します

3
Mina Fawzy

readonlyプライベートプロパティを初期化するデフォルトコンストラクターを定義したときにも、同じエラーが発生しました。

狂ったように見えたが、Javaに与えられた意味は読み取り専用という概念がなく、プロパティはおそらく定数に変換されている。).

0
MSC