我正在尝试实现IConvertible进行自定义转换.我正在使用.NET便携式,似乎它在那里不可用.但是MSDN文档说:
可移植类库
受支持:可移植类库
我有点担心这也出现了:
此API不符合CLS.
这就是它可能无法解决的原因吗?根据文档,它应该是System
命名空间的一部分.我试图在结构中实现接口.
有点像:
public struct ABC: Blah<Demo>, IConvertible
{}
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,我错过了一些非常小的东西.
更多信息:我的目标是.NET Framework 4.5和Windows 8.
如果给出两种类型(类型a,类型b),是否有任何"好"的方法来确定这两个是否可以进行比较,求和等?
我在想如果类型实现IConvertible
,可以将两者都转换成让我们说十进制并执行" Convert.ToDecimal(a) > Convert.ToDecimal(b)
"?
我正在构建一个表达式求值程序,并希望能够处理任何类型的对象,因此需要知道一个类型是否可以与另一个类型进行比较(它不必在两侧都是相同的类型.例如.double > int
)
该Convert
自.NET 1.0级已经存在.IConvertible
从那时起,界面也存在.
该Convert.ChangeType
方法仅适用于实现类型的对象IConvertible
(事实上,除非我弄错了,否则类提供的所有转换方法Convert
都是这样的).那么为什么参数类型object
呢?
换句话说,而不是这样:
public object ChangeType(object value, Type conversionType);
Run Code Online (Sandbox Code Playgroud)
为什么签名不是这个?
public object ChangeType(IConvertible value, Type conversionType);
Run Code Online (Sandbox Code Playgroud)
对我来说似乎很奇怪.
我有一个非常丑陋的方法,它应该从数据库中提取各种数据,并使用它构造一个请求类型的对象.目标是将各种丑陋归结到一个地方,以便从包含此方法的类派生的类可以相对干净.
当它应该返回单个对象时,即使类型可以为空,我也没有问题:
protected T getValue<T>(ParameterObject myParameterObject)
{
var typeOfT = typeof (T);
if (typeOfT == typeof(bool))
{
string val = this.getValue(myParameterObject);
if (val == null)
return default(T);
bool rVal;
if (!Boolean.TryParse(val, out rVal))
return default(T);
return changeType<T>(rVal);
}
if (typeOfT == typeof (double?))
{
string val = this.getValue(myParameterObject);
if (val == null)
return default(T);
double rVal;
if (!Double.TryParse(val, out rVal))
return default(T);
return changeType<T>(rVal);
}
[...]
}
public static T changeType<T>(object value)
{
var t = typeof(T);
if (!t.IsGenericType || …
Run Code Online (Sandbox Code Playgroud) 我有以下字典,我非常想使用 Json.Net 序列化它。字典包含IConvertible
接口的项目,允许我将所需的任何原始类型添加到字典中。
var dic = new Dictionary<string, IConvertible>();
dic.Add("bool2", false);
dic.Add("int2", 235);
dic.Add("string2", "hellohello");
Run Code Online (Sandbox Code Playgroud)
我有以下使用 Json.net 序列化列表的实现:
var settings = new JsonSerializerSettings();
settings.TypeNameHandling = TypeNameHandling.Objects;
var dicString = JsonConvert.SerializeObject(dic, Newtonsoft.Json.Formatting.Indented, settings);
Run Code Online (Sandbox Code Playgroud)
这给了我以下输出:
{
"$type": "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.IConvertible, mscorlib]], mscorlib",
"bool2": false,
"int2": 235,
"string2": "hellohello"
}
Run Code Online (Sandbox Code Playgroud)
然而。当尝试这样反序列化时:
var dic2 = JsonConvert.DeserializeObject<Dictionary<string, IConvertible>>(dicString);
Run Code Online (Sandbox Code Playgroud)
...我收到以下错误:
Error converting value False to type 'System.IConvertible'. Path 'bool2', line 3, position 16.
Run Code Online (Sandbox Code Playgroud)
我环顾四周,发现了以下内容;但设置 typeNameHandling 并没有解决问题。我也不能用IConvertible
类型名称属性来装饰该值,因为它是一个字典。
我还没有找到有关该主题的任何其他信息,因此我们将不胜感激!
我也找到了这个解决方案,但它涉及创建一个 ExpandableObjectConverter 这不是一个非常优雅的解决方案。 …
当我得到以下错误时,我试图将每个列表框项的列表框项和文本框值插入到数据库中.
如果我尝试插入列表框项目只有我成功,但当我尝试插入文本框值时,我得到此错误.你能告诉我我做错了吗?
Error Message: Object must implement IConvertible. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.InvalidCastException: Object must implement IConvertible. Source Error: Line 60: Line 61: Line 62: cmd.ExecuteNonQuery(); Line 63: Line 64:
c#CODE
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Specialized;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls; …
Run Code Online (Sandbox Code Playgroud) 我只是想知道Convert
类和IConvertible
接口是如何工作的DataRow
.如果我有这个代码:
string s="25";
int x= Convert.ToInt32(s);
Run Code Online (Sandbox Code Playgroud)
调用Convert.ToInt32(s)
将运行以下内容:
((IConvertible)s).ToInt32()
Run Code Online (Sandbox Code Playgroud)
那么如何使用这样的代码行:
Convert.ToInt32(myDataRow["intField"]);
Run Code Online (Sandbox Code Playgroud)
当DataRow和对象都没有实现IConvertible?
.Net Framework基类型,如Int32,Int64,Boolean等.实现IConvertible接口但是这些类型的所述元数据不包含在IConvertible接口中定义的方法,如ToByte,ToBoolean等的实现,.
我试图理解为什么基类型没有方法实现,即使它们实现了IConvertible接口.有人可以帮忙吗?
我正在使用以下代码查询LinqToExcel中的excel文件:
var excelFile = new LinqToExcel.ExcelQueryFactory(@"\"+txtFileName.Text.Replace(@"\\",@"\"));
var properties = from p in excelFile.Worksheet<Property>()
where AssessmentID != null
select p;
foreach (var autoP in properties)
doSomething();
Run Code Online (Sandbox Code Playgroud)
当我查看运行时调试器时,我会在查看属性变量的"结果视图"时看到"InvalidCastException" .所以,我假设我的班级定义有一些时髦的东西.我还假设我不需要将类的所有成员映射到excel文件,而只需要我认为合适的那些.
所以,这里也是类定义:
public class Property
{
[DataMember]
public int? Year { get; set; }
[DataMember]
public string ChangeReason { get; set; }
[DataMember]
public string AssessmentID { get; set; }
[DataMember]
public string CallBackNotes { get; set; }
[DataMember]
public string InspectionNotes { get; set; }
[DataMember]
public string Notes { get; …
Run Code Online (Sandbox Code Playgroud) 我正在运行以下代码:
var guidStr = "C105534D-E001-46F1-874A-322E5E0E132C";
var guid1 = Guid.Parse(guidStr);
var guid2 = Convert.ChangeType(guidStr, typeof(Guid));
Console.WriteLine(guid1 + " " + guid2);
Run Code Online (Sandbox Code Playgroud)
虽然guid1
得到一个值很好,但guid2
行引发异常:
Invalid cast from 'System.String' to 'System.Guid'.
at System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider)
at System.String.System.IConvertible.ToType(Type type, IFormatProvider provider)
at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
at System.Convert.ChangeType(Object value, Type conversionType)
Run Code Online (Sandbox Code Playgroud)
有什么不同?
不幸的是我使用的dll
是第二次解析失败的给定,所以不能真正改变实现,只有我的输入.
iconvertible ×10
c# ×8
.net ×3
changetype ×2
datarow ×1
excel ×1
generics ×1
guid ×1
json ×1
json.net ×1
jsonconvert ×1