【问题标题】:Xamarin DependencyService: System.MissingMethodException: Default constructor not found for [Interface]Xamarin DependencyService:System.MissingMethodException:未找到 [Interface] 的默认构造函数
【发布时间】:2016-11-15 11:42:08
【问题描述】:

我在 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);

我的错误再次出现:“System.MissingMethodException:未找到 Enchantum.Functions.PaymentProcessor 类型的默认构造函数”

出了什么问题?

P.S. 请原谅我不正确的接口命名约定以及其他一些混乱。

【问题讨论】:

    标签: c# dependency-injection xamarin.android xamarin.forms stripe.net


    【解决方案1】:

    就我而言,问题出在装配出口线。
    当我使用接口类型而不是类实现时,应用程序崩溃了:
    [assembly: Xamarin.Forms.Dependency(typeof(IServiceType))]

    正确的方法是使用接口的Platform-Specific实现:
    [assembly: Xamarin.Forms.Dependency(typeof(ServiceImplementation_Android))]

    【讨论】:

      【解决方案2】:

      我对 Linker 有同样的问题,当我将 Linker 设置为 None 时它​​的工作

      【讨论】:

        【解决方案3】:

        当我定义一个初始化 readonly 私有属性的默认构造函数时,我遇到了同样的错误。

        看起来很疯狂,但考虑到 Java 没有 readonly 的概念,并且该属性可能被转译为常量,这是有道理的。

        【讨论】:

          【解决方案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
          
           }
          }
          

          【讨论】:

          • 对于遇到此问题并想知道为什么您的代码似乎不太正确的任何人。依赖定义应该包括当前类PaymentProcessor_Android而不是接口PaymentProcessor
          • 和上面的例子一样,我的错误是写[assembly: Xamarin.Forms.Dependency(typeof(PaymentProcessor))],我收到了同样的错误。
          • 在我的例子中,构造函数受到保护,将其更改为 public 就可以了!
          • 我有一段时间摸不着头脑,但必须有 [assembly: Dependency(typeof([Your_Type))] 行。我不知道是否所有解析器都需要这一行,所以这可能被我忽略了,但 Xamarin Forms 需要。
          • @BradMoore - 对我来说是正确的答案......有界面而不是类。更改后,它按预期工作。谢谢。
          猜你喜欢
          • 2021-01-03
          • 1970-01-01
          • 2014-06-28
          • 2017-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多