【问题标题】:Xamarin PCL and sqlite.netXamarin PCL 和 sqlite.net
【发布时间】:2014-03-24 12:45:44
【问题描述】:

我需要在 pcl Xamarin 中将类型传递给函数,然后用于执行查询。 我尝试使用的代码是这样的:

public object sqlLeggi(string sql, Type myType){
 SQLiteCommand cmd = DB.CreateCommand(sql);
 var results = cmd.ExecuteQuery< myType > ();
[..]
}

但它不起作用,给我这个错误:

The type or namespace 'myType' could not be found.

有谁知道是否可以做这样的事情?

非常感谢

【问题讨论】:

  • 请注意,这与可移植类库、xamarin、monotouch、executequery 或 sqlite 无关。这只是 Type 对象和泛型类型参数之间的混淆。

标签: sqlite xamarin.ios xamarin portable-class-library executequery


【解决方案1】:

两个语句中的myType扮演着非常不同的角色:

public object sqlLeggi(string sql, Type myType){

这里,myType 是一个Type 对象,引用Type class 的一个实例。

var results = cmd.ExecuteQuery< myType > ();

这里,myType 是一个类型标识符,它是一个引用特定类型的句法结构,在这种情况下实际上将命名 myType .

现在,通常有两种方法来处理这个特定问题:

  1. 查看cmd 中的对象类型,看看是否存在ExecuteQuery 的重载或替代方法,它采用Type 对象参数代替
  2. 使您的方法具有通用性,这样您就没有 Type 对象开始了。

第一种情况大概会这样写:

var results = cmd.ExecuteQuery(myType);

第二个是这样的:

public myType sqlLeggi<myType>(string sql{
    SQLiteCommand cmd = DB.CreateCommand(sql);
    var results = cmd.ExecuteQuery< myType > ();
    [..]
}

请注意:

  1. 我让方法返回 myType 而不是 object
  2. myType 现在被指定为方法的通用参数:sqlLeggi&lt;myType&gt;

在这种情况下,命名约定将规定您的泛型类型参数命名为 T 或以 T 开头的名称,所以这是我的建议:

public T sqlLeggi<T>(string sql{
    SQLiteCommand cmd = DB.CreateCommand(sql);
    var results = cmd.ExecuteQuery<T>();
    [..]
}

【讨论】:

  • 这正是我的回答方式。我希望我可以多次投票。
猜你喜欢
  • 2018-11-23
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2017-04-06
  • 2019-06-24
  • 1970-01-01
相关资源
最近更新 更多