C# 初始化组件Xamarin中的TypeInitializationException异常
下面是我在Xamarin中创建的页面的代码。这是一个显示GenRegroups列表的简单页面。它在过去工作得很好,但最近,当我更改初始化列表的代码时,应用程序将运行到一个空白屏幕。因此,我暂停了调试,并看到它最初停留在listView.ItemSource=DataStorage.GenreList;。点击continue后,应用程序将抛出TypeInitializationException。我担心可能没有生成我的代码的最新版本(在启用快速部署的情况下,我以前也遇到过这种情况),所以我添加了一个Debug.log(“x”);在出现问题的行之前,确保正在运行最新的代码。执行此操作后,应用程序开始冻结InitializeComponent()并引发相同的异常。我在这里不知道该怎么办。以下是我声明列表的代码:C# 初始化组件Xamarin中的TypeInitializationException异常,c#,android,xamarin,xamarin.forms,xamarin.android,C#,Android,Xamarin,Xamarin.forms,Xamarin.android,下面是我在Xamarin中创建的页面的代码。这是一个显示GenRegroups列表的简单页面。它在过去工作得很好,但最近,当我更改初始化列表的代码时,应用程序将运行到一个空白屏幕。因此,我暂停了调试,并看到它最初停留在listView.ItemSource=DataStorage.GenreList;。点击continue后,应用程序将抛出TypeInitializationException。我担心可能没有生成我的代码的最新版本(在启用快速部署的情况下,我以前也遇到过这种情况),所以我添加了一
namespace FBLALibraryApp2
{
public partial class GenrePage : ContentPage
{
public GenrePage()
{
InitializeComponent();
listView.ItemsSource = DataStorage.GenreList;
}
private void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
{
}
private void listView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
listView.SelectedItem = null;
}
async private void listView_ItemTapped(object sender, ItemTappedEventArgs e)
{
if (e.Item is GenreGroup)
await Navigation.PushAsync(new GenreView((GenreGroup)e.Item));
}
}
}
公共静态类数据存储
{
公共静态列表AllBookList=new List{new Book{Title=“Harry Potter”,Author=“J.K.Rowling”,Summary=“lorem ipsum dolorum sdjfa;dklfja;dkfj;akdfja;dfjkaf”,Genre=new string[]{“幻想”、“冒险”},pubYear=“2017”},新书{Title=“饥饿游戏”,Author=“Suzanne Collins”,Summary=“lorem ipsum dolorum sdjfa;dklfja;dkfj;akdfja;dfjkaf”,体裁=新字符串[]{“Sci Fi”},pubYear=“2017”},新书{Title=“夜贼”,Author=“Jack Nimble”,Summary=“lorem ipsum dolorum sdjfa;dklfja;dklfj;akdffja;dfjkaf”,体裁=新字符串[]{“神秘”},pubYear=“2017”},新书{Title=“Hardy Bros.”,Author=”Johnny Heather”,Summary=“lorem ipsum dolorum sdjfa;dklfja;dkfj;akdfja;dfjkaf”,流派=新字符串[]{“神秘”、“喜剧”},pubYear=“2017”};
公共静态列表GenreList=新列表{new GenreGroup(“神秘”、“jd;akfjd;”),new GenreGroup(“幻想”、“dja;fdjkl”)};
publicstaticgenregroupsummary=新的genregroupsummary(“summary”、“djfsldfjldjF”);
公共静态genregroupfantasy=新的genregroupfantasy(“Fantasy”、“djfsldfjldjF”);
静态数据存储()
{
foreach(所有图书列表中的图书)
{
for(int x=0;x
我怀疑问题出在这段代码中的某个地方,因为这就是我所更改的。注意:我知道我现在的代码有点奇怪,我显式定义了GenreList,后来又重新定义了它,但我试图确保它不为null,无论出于什么原因。谢谢您的帮助
更新:在将Debug.WriteLine放在InitializeComponent之前时,它现在在Debug.WriteLine上冻结,并抛出相同的TypeInitializationEXception
更新:这是GenRegroupandBook的代码
public static class DataStorage
{
public static List<Book> AllBookList = new List<Book> { new Book { Title = "Harry Potter", Author = "J.K. Rowling", Summary="lorem ipsum dolorum sdjfa;dklfja;dkfj;akdfja;dfjkaf", Genre= new string[] { "Fantasy", "Adventure" }, pubYear="2017" }, new Book { Title = "The Hunger Games", Author = "Suzanne Collins", Summary = "lorem ipsum dolorum sdjfa;dklfja;dkfj;akdfja;dfjkaf", Genre = new string[] { "Sci-Fi" }, pubYear = "2017" }, new Book { Title = "Thief in the Night", Author = "Jack Nimble", Summary = "lorem ipsum dolorum sdjfa;dklfja;dkfj;akdfja;dfjkaf", Genre = new string[] { "Mystery"}, pubYear = "2017" }, new Book { Title = "Hardy Bros.", Author = "Johnny Heather", Summary = "lorem ipsum dolorum sdjfa;dklfja;dkfj;akdfja;dfjkaf", Genre = new string[] { "Mystery", "Comedy" }, pubYear = "2017" } };
public static List<GenreGroup> GenreList = new List<GenreGroup> { new GenreGroup("Mystery", "jd;akfjd;"), new GenreGroup("Fantasy", "dja;fdjkl") };
public static GenreGroup Mystery = new GenreGroup("Mystery","djfsldfjldjF");
public static GenreGroup Fantasy = new GenreGroup("Fantasy", "djfsldfjldjF");
static DataStorage()
{
foreach (Book book in AllBookList)
{
for (int x = 0; x < book.Genre.Length; x++)
{
if (book.Genre[x] == "Mystery")
{
Mystery.Add(book);
}
else if (book.Genre[x] == "Fantasy")
{
Fantasy.Add(book);
}
}
}
GenreList = new List<GenreGroup> { Mystery, Fantasy };
}
}
public类GenreGroup:List
{
公共字符串标题{get;set;}
公共字符串说明{get;set;}
公共GenreGroup(字符串标题、字符串描述)
{
头衔=头衔;
描述=描述;
}
}
公共课堂用书
{
公共字符串标题{get;set;}
公共字符串作者{get;set;}
公共字符串摘要{get;set;}
公共字符串[]主题标题{get;set;}
公共字符串[]类型{get;set;}
公共字符串pubYear{get;set;}
}
listView.ItemsSource=DataStorage.GenreList
此行将调用静态数据存储()
,在此静态构造函数中,神秘
和幻想
应在调用它之前初始化。因此解决方案应该是:
1) 在GenreGroup
类中添加public GenreGroup(){}
2) 在数据存储
类中初始化神秘
和幻想
:
public class GenreGroup : List<Book>
{
public string Title { get; set; }
public string Description { get; set; }
public GenreGroup(string title, string description)
{
Title = title;
Description = description;
}
}
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
public string Summary { get; set; }
public string[] subjectHeadings { get; set; }
public string[] Genre { get; set; }
public string pubYear { get; set; }
}
此处缺少初始化:
public static GenreGroup Mystery = new GenreGroup();
public static GenreGroup Fantasy = new GenreGroup();
编辑:我刚刚运行了你的代码,很好。只需清理你的项目并重建它。VS有很多错误。干杯。数据存储是初始化的还是空的?属性是
Title
和Description
来自GenreGroup
静态的吗?嗨,你解决了你的问题了吗?你尝试过我的解决方案吗如果您做了什么,请留下评论,谢谢。@Greggz属性标题和描述不是静态的,因为GenreGroup不是静态类(有许多不同的类型,因此我要创建许多不同的GenreGroup对象)。另外,我不太清楚你所说的初始化或空是什么意思。如果你能进一步解释,那就太好了。我的印象是,如果你有一个静态类,你不需要调用或初始化它,但也许我错了?@Greggz我想我已经通过公开静态GenreGroup神秘=新类型来初始化了神秘和幻想组(…);此外,我更新了我的问题,以添加GenreGroup和Book的代码。我按照您的答案进行了操作,但问题仍未解决。似乎GenrePage()构造函数中的任何第一行都会引发TypeInitializationException,无论这是Debug.WriteLine还是InitializeComponent()此行将调用不正确的静态DataStorage()。静态构造函数总是在任何其他代码之前运行。
public static GenreGroup Mystery; // Init this
public static GenreGroup Fantasy; // And this