Tag: 投射

数组中的不同类型,如何在将它们从数组中取出时知道将它们转换为什么?

假设类型为Packet的通用List ,包含扩展Packet的自定义类,例如LoginPacket或ChatPacket 。 假设我将这些放在列表中。 当我拿出它们时,每个最“特定”的类型是Packet 。 我想把它们转换成更具体的类型,然后回到原来的LoginPacket或ChatPacket,或者回到原来的类型。 问题:我该怎么办? 参考: 如何在运行时以编程方式转换对象? 所以…似乎这些自定义类共享一个通用接口,它会解决转换问题吗? 但如果是这样,我的类不能共享一个接口。 我需要在接口和类上构建接口。 那么……我该怎么做? 对不起,如果这个问题不那么准确。 不确定如何表达我的确切问题。

创建未知类型的数组。 C#

在C#中使用reflection时,你应该传递一个稍后投射的参数的对象[],我有一个gui,让用户输入参数值。我知道他们希望输入什么类型的输入,int,string,float,自定义对象的实例等…如果参数是某种类型的数组int [] foo [],它允许用户构造该类型的数组,并添加/删除元素。 我不知道的是我如何使用这些信息(我知道数据的类型是类型t。)我如何构造一个数组t [],这样当它被赋予调用时,它可以转换为该数组类型。 例如,现在如果我有一个需要一个整数数组作为参数的函数,我当前正在传递一个对象[],其中有一个用整数填充的另一个对象[],但你不能只是转换对象[]到int []所以调用失败。 我不能写一个switch case,因为它不可能预测它可能是所有可能的类型(例如,在加载的dll中定义的其他类的实例)

编译器无法转换受约束的generics类型

我有一个通用类型为“G”的类 在我的class级模型中我有 public class DetailElement : ElementDefinition 假设我有这样的方法 public void DoSomething(G generic) where G : ElementDefinition { if (generic is DetailElement) { ((DetailElement)generic).DescEN = “Hello people”; //line 1 ////// ElementDefinition element = generic; ((DetailElement)element).DescEN = “Hello again”; //line 3 ////// (generic as DetailElement).DescEN = “Howdy”; //line 5 } else { //do other stuff } } […]

如何使用generics来处理需要仔细投射的返回值?

我有一些数据访问层代码调用存储过程并返回各种数据类型的标量值。 语法是ExecuteDecimal,ExecuteString等。我希望它是Execute或Execute 我尝试这个实现,我无法编译,除非我正在使用“(T)值”进行转换,如果我尝试检查类型并调用方法进行转换,没有这样的运气。 更新的问题为什么我必须在转换为T之前转换为对象? 更新的代码 internal T Execute(string storedProcName, Hashtable parameters) { //Next lines do compile (thanks to suggestions from answers!) if (typeof(T) == typeof(string)) return (T) (object) ExecuteScalar(storedProcName, parameters).ToString(); else if (typeof(T) == typeof(int)) return (T)(object) Convert.ToInt32(ExecuteScalar(storedProcName, parameters)); //Next line compiles, but not all things boxed in an object can //be converted straight to […]

编译器使用显式转换为.NET类型将显式转换替换为我自己的类型?

我有以下代码: public struct Num { private readonly T _Value; public Num(T value) { _Value = value; } static public explicit operator Num(T value) { return new Num(value); } } … double d = 2.5; Num b = (Num)d; 这段代码编译,令我惊讶。 显式转换应该只接受一个byte ,而不是一个byte 。 但双重被接受了。 当我在转换器中放置断点时,我看到该value已经是值为2的byte 。 通过从double到byte的转换应该是显式的。 如果我用ILSpy反编译我的EXE,我会看到下一个代码: double d = 2.5; Program.Num b = (byte)d; […]

没有T,在C#中将任务转换为任务

我有静态类充满扩展方法,其中每个方法都是异步的并返回一些值 – 如下所示: public static class MyContextExtensions{ public static async Task SomeFunction(this DbContext myContext){ bool output = false; //…doing stuff with myContext return output; } public static async Task<List> SomeOtherFunction(this DbContext myContext){ List output = new List(); //…doing stuff with myContext return output; } } 我的目标是能够从另一个类中的单个方法调用任何这些方法,并将其结果作为对象返回。 它看起来像这样: public class MyHub: Hub{ public async Task InvokeContextExtension(string […]

输入类型的通用方法

我正在尝试编写通用方法来转换类型。 我想写一些像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#对象拆分为动态类型

我正在尝试做这样的事情: void someMethod(TypeA object) { … } void someMethod(TypeB object) { … } object getObject() { if (…) return new TypeA(); else return new TypeB(); } object obj = getObject(); (obj.GetType()) obj; // won’t compile someMethod(obj); 显然我在这里很困惑。 我知道我可以通过写出条件陈述来完成这项工作 – if (obj.GetType() == typeof(TypeA)) obj = (TypeA)obj; else if (obj.GetType() == typeof(TypeB)) obj = (TypeB)obj; – […]

将字符串转换为字符串的generics类型

我正在编写一个方法来进行智能类型转换 – 如果类型参数恰好是一个字符串,则使用ToString(),否则转换,但如果转换不起作用则返回null。 基本上可以获得尽可能多的信息,而不会抛出exception。 我在尝试演员之前检查T确实是一个string ,但编译器仍然不是粉丝: Cannot convert type ‘string’ to ‘T’ 这是我的方法: public T? Convert(object v) { if (typeof(T) == typeof(string)) { return (T)v.ToString(); // Cannot convert type ‘string’ to ‘T’ } else try { return (T)v; } catch (InvalidCastException) { return null; } } 如果这是某种不可饶恕的罪,请告诉我。 我用它来处理一些可能有混合类型的数据结构。

将对象的通用集合传递给需要基类型集合的方法

假设我有一个期望基类型的generics集合参数的方法,请参阅下面的Test.MethodA(IEnumerable(BaseClass)listA) 。 为什么我传递代码不会构建的派生类型的集合? 难道DerivedClass的所有实例都不是BaseClass吗? 我本来可以创建一个新的List(BaseClass)并将其传递给MethodA(IEnumerable(BaseClass)listA) 。 但我认为C#足够聪明,知道DerivedClass的集合具有与BaseClass集合相同的所有属性。 使用List.Cast(T)()方法,因为我已经展示了解决此问题的最佳方法? abstract class BaseClass { public int SomeField; public abstract string SomeAbstractField { get; } } class DerivedClass:BaseClass { public override string SomeAbstractField { get { return “foo”; } } } class TestClass { public void MethodA(IEnumerable listA) { } public void MethodB() { List listB = new […]