Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为C中给定的类型创建任意数字/基元值类型的非零实例#_C#_Reflection - Fatal编程技术网

C# 为C中给定的类型创建任意数字/基元值类型的非零实例#

C# 为C中给定的类型创建任意数字/基元值类型的非零实例#,c#,reflection,C#,Reflection,假设您有一个名为primitiveType的Type和primitiveType.IsPrimitive==true,如何最简洁地(不使用第三方库)创建一个非零值(例如value=1)的实例 也就是说,函数可以如下所示: public static object CreateNonZero(Type primitiveType) { if (!primitiveType.IsPrimitive) { throw new ArgumentException("type must b

假设您有一个名为
primitiveType
Type
primitiveType.IsPrimitive==true
,如何最简洁地(不使用第三方库)创建一个非零值(例如value=1)的实例

也就是说,函数可以如下所示:

public static object CreateNonZero(Type primitiveType)
{
    if (!primitiveType.IsPrimitive)
    { throw new ArgumentException("type must be primitive"); }

    // TODO
}
也就是说,它应该适用于所有基本值类型,例如bool、byte、sbyte、short、ushort、int、uint、long、ulong、float、double、IntPtr、UIntPtr、char等

Convert.ChangeType(1, primitiveType)
注意:如果您希望返回类型与实际类型匹配,而不是成为
对象
,则执行通用版本相对容易:

public static T CreateNonZero<T>()
{
    return (T)Convert.ChangeType(1, typeof(T));
}
注意:如果您希望返回类型与实际类型匹配,而不是成为
对象
,则执行通用版本相对容易:

public static T CreateNonZero<T>()
{
    return (T)Convert.ChangeType(1, typeof(T));
}

在这种情况下,进行常规强制转换是否比使用
as
操作符更合适?即
返回(T)转换.ChangeType(1,typeof(T))
。我记不起当
t
不受约束并且使用了
as
运算符时会发生什么(因为
t
可能是一种值类型)。不适用于
IntPtr
UIntPtr
这两种基元类型。@CodesInChaos我认为没有任何通用方法适用于每种基元。处理
IntPtr
UIntPtr
可能需要一些额外的
if
语句。@BenAaronson我很想检查您的答案是否正确,但为此,我更希望您添加第三个示例来处理我确实需要的IntPtr和UIntPtr。非常感谢!我不知道static Convert.ChangeType选项,因此至少对我有所帮助。在这种情况下,执行常规强制转换比使用
as
运算符更合适吗?即
返回(T)转换.ChangeType(1,typeof(T))
。我记不起当
t
不受约束并且使用了
as
运算符时会发生什么(因为
t
可能是一种值类型)。不适用于
IntPtr
UIntPtr
这两种基元类型。@CodesInChaos我认为没有任何通用方法适用于每种基元。处理
IntPtr
UIntPtr
可能需要一些额外的
if
语句。@BenAaronson我很想检查您的答案是否正确,但为此,我更希望您添加第三个示例来处理我确实需要的IntPtr和UIntPtr。非常感谢!我不知道static Convert.ChangeType选项,因此至少对我有所帮助。
decimal
是一种值类型,但不是基元类型。您确定关心基元类型吗?原语在很大程度上是运行时的一个实现细节,在更高级别的代码中通常没有用处。你不是指数字类型吗?是否要支持
biginger
Decimal
?那
bool
char
IntPtr
呢?很抱歉,是的,十进制不是一种基本类型,很抱歉。支持这一点也很好。是的,我认为bool、char和IntPtr都是在基本类型中考虑的。BigInteger也很好。
decimal
是一种值类型,但不是基元类型。确实关心基元类型吗?原语在很大程度上是运行时的一个实现细节,在更高级别的代码中通常没有用处。你不是指数字类型吗?是否要支持
biginger
Decimal
?那
bool
char
IntPtr
呢?很抱歉,是的,十进制不是一种基本类型,很抱歉。支持这一点也很好。是的,我认为bool、char和IntPtr都是在基本类型中考虑的。BigInteger也很棒。