Tag: 类型

如何确定类型是否是一种集合?

我试图确定运行时类型是否是某种集合类型。 我在下面的工作,但似乎很奇怪,我必须将我认为的数据类型命名为数组,就像我所做的那样。 在下面的代码中,通用逻辑的原因是因为,在我的应用程序中,我希望所有集合都是通用的。 bool IsCollectionType(Type type) { if (!type.GetGenericArguments().Any()) return false; Type genericTypeDefinition = type.GetGenericTypeDefinition(); var collectionTypes = new[] { typeof(IEnumerable), typeof(ICollection), typeof(IList), typeof(List) }; return collectionTypes.Any(x => x.IsAssignableFrom(genericTypeDefinition)); } 我如何重构此代码以使其更智能或更简单?

双倍的范围是否比长的更大?

在MSDN上的一篇文章中,它声明double数据类型的范围是“-1.79769313486232e308 .. 1.79769313486232e308”。 而long数据类型仅具有“-9,223,372,036,854,775,808 … 9,223,372,036,854,775,807”的范围。 如果两个数据都是64位,那么double如何保存这么多数据? http://msdn.microsoft.com/en-us/library/cs7y5x0x(v=vs.90).aspx

如何在C#中检查运行时类型的可分配性?

Type类有一个几乎可以工作的方法IsAssignableFrom()。 不幸的是,如果两个类型相同或第一个在第二个层次结构中,它只返回true。 它表示十进制不能从int赋值,但是我想要一个方法来指示小数可以从整数分配,但是整数并不总是可以从小数分配。 编译器知道这一点,但我需要在运行时解决这个问题。 这是扩展方法的测试。 [Test] public void DecimalsShouldReallyBeAssignableFromInts() { Assert.IsTrue(typeof(decimal).IsReallyAssignableFrom(typeof(int))); Assert.IsFalse(typeof(int).IsReallyAssignableFrom(typeof(decimal))); } 有没有办法实现IsReallyAssignableFrom(),它可以像IsAssignableFrom()一样工作,但也传递上面的测试用例? 谢谢! 编辑: 这基本上就是它的使用方式。 这个例子不为我编译,所以我不得不将Number设置为0(而不是0.0M)。 [AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter)] public class MyAttribute : Attribute { public object Default { get; set; } } public class MyClass { public MyClass([MyAttribute(Default= 0.0M)] decimal number) { Console.WriteLine(number); } } 我收到此错误:错误4属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式

在C#中确定调用对象类型

无论这是否是一个好主意,是否可以实现一个接口,其中执行函数知道调用对象的类型? class A { private C; public int doC(int input) { return C.DoSomething(input); } } class B { private C; public int doC(int input) { return C.DoSomething(input); } } class C { public int DoSomething(int input) { if(GetType(CallingObject) == A) { return input + 1; } else if(GetType(CallingObject) == B) { return input + 2; […]

输入类型的通用方法

我正在尝试编写通用方法来转换类型。 我想写一些像Cast.To(variable)而不是(Type) variable 。 我这个方法的错误版本: public class Cast { public static T To(object o) { return (T) o; } } 这是一个简单的测试: public class A { public static explicit operator B(A a) { return new B(); } } public class B { } A a = new A(); B b = Cast.To(a); 正如您猜测的那样,此代码将因InvalidCastException而失败。 此代码是否失败,因为虚拟机不知道如何在运行时将类型object变量转换为类型B ? 但是exception消息说:“无法将类型A的对象转换为B类”。 […]

在C#中:如何声明一个类型为key的通用Dictionary和该类型的IEnumerable 作为值?

我想声明一个字典,用于存储特定类型的类型IEnumerable ,并将其确切类型作为键,如下所示:(编辑后跟随johny g的评论) private IDictionary<Type, IEnumerable> _dataOfType where T: BaseClass; //does not compile! 我想要存储的具体类都是从BaseClass派生的,因此想把它当作约束。 编译器抱怨它希望在成员名称后面加一个分号。 如果它可以工作,我希望这将使后来从字典中检索简单如下: IEnumerable concreteData; _sitesOfType.TryGetValue(typeof(ConcreteType), out concreteData); 如何定义这样的字典?

为什么C#号码类型是不可变的?

为什么int和double都是不可变的? 每次要更改值时返回新对象的目的是什么? 我问的原因是因为我正在创建一个类: BoundedInt ,它有一个值以及一个上限和下限。 所以我想知道:我是否应该使这种类型不变? (或者它应该是一个struct吗?)

转换为C#中的reflection类型

请考虑以下代码: object objFoo = MakeFoo(); // object MakeFoo(){return new Foo();} MethodInfo methodInfo = typeof(Program).GetMethod(“Baz”); // Foo Baz(){return foo;} Type typeFoo = methodInfo.ReturnType; var result = (typeFoo)objFoo; 我是否需要使用typeFoo做一些魔法来获得结果?

C#.NET的区间数据类型?

我正在寻找.NET 4.0的间隔数据类型。 例如,间隔(a,b),所有点x使得a <x <= b。 我希望能够做的是创建具有以下特性的间隔: 封闭和开放的 无限区间,完全无界,右/左无界。 有了这些,我想做的事情如下: 检查点是否在某个区间内。 检查两个间隔是否重叠。 将两个重叠间隔合并为一个间隔。 检查间隔集合是否包含单个间隔。 等等:) 如果我能同时处理数值数据类型和日期时间会很好。 我知道逻辑非常简单,但我认为没有理由认为我是第一个需要这样做的人。

在声明枚举时,是否应该将类型强制为256个实体以下的字节?

如果你的应用程序中有一个枚举而你只有几个项目,你应该强制基础类型是最小的类型吗? enum smaller : byte { one, two, three };