我开始学习WP7的C#,我正在制作一个应用来抓取各种网站并在页面上显示几项信息。
我将允许用户在手机上创建多个“帐户” - 每个帐户都是特定网站的一组登录详细信息。例如,如果我使用stackoverflow作为示例,我将有一个类:
public abstract class MyBaseClass
{
public Dictionary<string, string> fields;
}
public class StackOverflow : MyBaseClass
{
public StackOverflow()
{
fields.Add("Username", "Default Username");
fields.Add("Password", "");
}
}
该课程将完成所有工作,我希望人们能够提交新课程以包含在以后的版本中。
应用程序将迭代每个字段,向用户显示相应的表单字段。完成后,UI将更新字典,准备开始抓取。
使用字典似乎可以开始,但我没有考虑如何表示数据类型 - 我想定义输入应该是文本,数字还是密码。
我如何才能最好地包含这些数据?
答案 0 :(得分:2)
鉴于屏幕抓取充其量是坏事并且最糟糕的是灾难性的,我必须建议您只包含提供公共文档API的站点(或服务),然后使用该引用来定义您正在存储的数据类型。
也就是说,如果您使用的是C#/ .NET 4,则可能需要使用Tuple数据类型。
答案 1 :(得分:1)
要记住这个模式的一件事是,你使用这个对象所做的一切都基于“魔术字符串”。字符串数据很少,可以在编译时检查;引用为字符串的字段名称可能具有拼写错误,编译器会立即捕获该错误;类似地,将“ABC123”设置为应该是小数的字段就好了,直到你尝试解析它为止。
如果您决定沿着这条路走下去,我会将Dictionary更改为包含该字段所有元数据的自定义类的列表;它的名称,类型,当前值等。列表应该受到保护,并通过类中的一个或多个索引器访问,这些索引器派生自MyBaseClass类,它可以根据索引位置或字段名称提取数据,如情况可能要求。
请注意,在更改为List时,天真的实现会导致字段的线性搜索时间,而Dictionary会为您提供对数访问时间。您可以通过对列表进行排序并实现BinarySearch来查找字段名称来缓解此问题。
答案 2 :(得分:0)
您将不得不创建自己的模型来表示这一点。做自然而有意义的事情。怎么样:
public enum InputType
{
Text,
Number,
Password
}
public class Value
{
public object Value { get; set;}
public InputType InputType { get; set;}
}
public abstract class MyBaseClass
{
public Dictionary<string, Value> fields;
}
public class StackOverflow : MyBaseClass
{
public StackOverflow()
{
fields.Add("Username", new Value() {
Value = "Default Username",
InputType = InputType.Text
});
fields.Add("Password", new Value() {
Value = "hw78fksm9",
InputType = InputType.Password
});
}
}
顺便说一下,不要将fields
变量MyBaseClass
公开,这是一个实现细节,应隐藏/封装!