C# 如何在.NET中将源于类型A的对象强制转换为类型B?
我创建了一个包含两个项目的项目。 一个是控制台应用程序,另一个是类库项目 我将类库项目中的dll引用添加到控制台应用程序中 现在,当我从类库项目返回一个对象时,可以在控制台应用程序中检索它,但如果我尝试强制转换它,它就不起作用了 它抛出错误,因为无法将类型a转换为类型b 我为这个错误挣扎了好几个小时 类库项目的我的代码:C# 如何在.NET中将源于类型A的对象强制转换为类型B?,c#,asp.net,.net,object,casting,C#,Asp.net,.net,Object,Casting,我创建了一个包含两个项目的项目。 一个是控制台应用程序,另一个是类库项目 我将类库项目中的dll引用添加到控制台应用程序中 现在,当我从类库项目返回一个对象时,可以在控制台应用程序中检索它,但如果我尝试强制转换它,它就不起作用了 它抛出错误,因为无法将类型a转换为类型b 我为这个错误挣扎了好几个小时 类库项目的我的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; n
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ClassLibrary1
{
public class Class1
{
public object dyn()
{
var obj = new { ID = 2, Name = "Rajesh" };
return obj;
}
}
}
在上面,我返回了一个列表作为对象
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq;
using System.Data.SqlClient;
using System.Collections;
using System.Data;
using ClassLibrary1;
using System.Reflection;
using System.ComponentModel;
namespace ConsoleApplication2
{
public class Program
{
public static void Main(string[] args)
{
Program objPgm = new Program();
Class1 objCls=new Class1();
object obj = objCls.dyn();
var list = objPgm.cast(obj, new { ID = 0, Name = "" });
}
public T cast<T>(object obj,T type)
{
return (T)obj;
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Linq;
使用System.Data.SqlClient;
使用系统集合;
使用系统数据;
使用ClassLibrary1;
运用系统反思;
使用系统组件模型;
命名空间控制台应用程序2
{
公共课程
{
公共静态void Main(字符串[]args)
{
Program objPgm=新程序();
Class1 objCls=新的Class1();
object obj=objCls.dyn();
var list=objPgm.cast(obj,new{ID=0,Name=”“});
}
公共T类型转换(对象对象对象,T类型)
{
返回(T)obj;
}
}
在上面的代码中,我从类库项目中检索了对象,并在尝试强制转换InvalidCastException时抛出
这有什么办法吗
请在这个问题上帮助我
提前感谢。看来您正在使用这个技巧。它不会在程序集之外工作,因为编译器在每个程序集中生成两个独立的匿名类型
最好的解决方法是使用您自己的类型,并在公共程序集中共享它
public class MyData
{
public int ID {get;set;}
public string Name{get;set;}
}
匿名类型仅在以下情况下共享相同的编译时类型:
- 它们共享完全相同的参数名称、类型和顺序
- 它们存在于同一个组件中
ClassLibrary1
中简单地定义一个类来包含ID
和Name
。这样做可以强烈地键入整个过程,并且不需要从本质上复制返回的信息的结构
给您一个示例,说明您的代码现在(或多或少)在做什么:
namespace ClassLibrary1
{
internal class ClassLibrary1_AnonObj1
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Class1
{
public object dyn()
{
var obj = new ClassLibrary1_AnonObj1 { ID = 2, Name = "Rajesh" };
return obj;
}
}
}
namespace ConsoleApplication2
{
internal class ClassLibrary2_AnonObj2
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Program
{
public static void Main(string[] args)
{
Program objPgm = new Program();
Class1 objCls=new Class1();
object obj = objCls.dyn();
var list = objPgm.cast(obj, new ClassLibrary2_AnonObj2 { ID = 0, Name = "" });
}
public T cast<T>(object obj,T type)
{
return (T)obj;
}
}
}
这就是它失败的原因,因为这两种类型看起来完全不同。如果您声明并使用自己的类:
namespace ClassLibrary1
{
public class MyInfo
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Class1
{
public MyInfo dyn()
{
var obj = new MyInfo { ID = 2, Name = "Rajesh" };
return obj;
}
}
}
namespace ConsoleApplication2
{
public class Program
{
public static void Main(string[] args)
{
Program objPgm = new Program();
Class1 objCls=new Class1();
MyInfo obj = objCls.dyn();
}
}
}
这消除了任何强制转换的需要。或者,如果您需要它使其返回对象
,您只需在此时强制转换即可:
Class1 objCls=new Class1();
MyInfo obj = (MyInfo)objCls.dyn();
尽管我怀疑您使用的dyn()
意味着您打算返回一些动态创建的内容或不同的类型。也许需要更多的上下文、重构或更好的设计
Class1 objCls=new Class1();
MyInfo obj = (MyInfo)objCls.dyn();