类型'MyClass'没有找到默认构造函数。

12
我想要从xamarin.forms渲染自定义视图。当我尝试使用以下代码进行渲染时会出现错误:

[assembly: ExportRenderer(typeof(SwipeableCard),typeof(CardContainer))] .

错误信息为:

类型“Com.andtinde.CardContainer”的默认构造函数未找到。

我猜这是因为Card Container没有默认构造函数。而我无法提供一个默认构造函数,因为它继承自Adapterview。
我做错了什么?感谢任何帮助。
6个回答

26

我认为这是Xamarin已知的一个错误。虽然我在使用Dependency Service时遇到了同样的问题,但我通过在iOS Build Options Linker behavior中设置“Link Framework SDKs Only”来解决了这个问题。


3
如果我们想保持所有程序集的链接,该怎么办?这更像是一种解决方法而不是解决方案... - Umar3x
3
这不是正确的答案。这是一个愚蠢的变通方法。完整链接有其目的,移除完整链接并不能成为解决方案。你需要添加跳过程序集或在每个类和成员上使用 [Runtime.Preserve(AllMembers = true)]。 - Emil
2
这不是一个解决方案。 - Luca Ziegler

4

您已经确定了自己的错误。ExportRenderer需要一个默认构造函数才能完成它正在做的事情。为什么从AdapterView继承会阻止您拥有默认构造函数?

您应该可以尝试以下操作:

public class CardContainer
{
    public CardContainer() // This is a default constructor
        : base(...) // If base class requires arguments, pass them here
    {
    }
}

谢谢@Steve,让我试一下。 - Tinku Chacko

3

这不是Xamarin的一个bug,你需要了解如何管理你的链接程序集。在Xamarin中所有的运行时操作都会出现诸如此类的错误,例如当该程序集没有被链接时,在运行时无法获取类的属性或创建实例。

你可以手动管理链接程序集,或者像Alessio Campanelli这里所回答的那样,在应用程序选项中设置它们。如果你没有手动设置它们,你的应用程序在发布包(例如apk文件)中的大小将会变得很大。

如何手动设置呢?

  1. 在你的Android应用程序中创建一个名为 "linked.xml" 的xml文件。
  2. 右键单击 "linked.xml" 并转到 "属性" ,将 "Build Action" 设置为 "LinkDescription"。
  3. 添加你在运行时使用的程序集,就像这样:
    <?xml version="1.0" encoding="utf-8" ?>
    <linker>
      <assembly fullname="Newtonsoft.Json">
        <type fullname="*" />
      </assembly>
    </linker>

Xamarin中的链接器


3

通常在您使用类进行依赖注入或使用特定于设备的类时会出现此问题。您可以通过调试来尝试解决它。我曾经遇到过同样的问题,但是通过将当前类提供给 typeof 属性来解决它。不应该给出服务或任何其他接口名称:

[assembly: Xamarin.Forms.Dependency(typeof(Name Of Class))]

而不是:

[assembly: Xamarin.Forms.Dependency(typeof(Name Of Interface))]

2

你最好从ViewRenderer继承,并将CardContainer作为本地视图类型提供。然后重写ViewRenderer的OnElementChanged方法并为渲染器构造一个新的CardContainer。下面是一个简短的版本,可以帮助你入门。

注册:

[assembly: ExportRenderer(typeof(SwipeableCard), typeof(SwipeableCardRenderer ))]

类定义:

 SwipeableCardRenderer : ViewRenderer<SwipeableCard, CardContainer>

OnElementChanged重写:

if (this.Control == null)
{
    this.SetNativeControl(new CardContainer(this.Context));
}

0
在更新了所有的NuGet包之后,我也遇到了这个问题。最终,我使用了一些间接的修复方法,通过虚拟调用一个类来解决问题(例如,isLogged == "55"永远不会被执行)。
    //added this code to fix default constructor issue for appshell pages
    if(isLogged == "55")
    {
        MainPage = new HomePage();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接