Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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# 如何在.NET中将源于类型A的对象强制转换为类型B?_C#_Asp.net_.net_Object_Casting - Fatal编程技术网

C# 如何在.NET中将源于类型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

我创建了一个包含两个项目的项目。 一个是控制台应用程序,另一个是类库项目

我将类库项目中的dll引用添加到控制台应用程序中

现在,当我从类库项目返回一个对象时,可以在控制台应用程序中检索它,但如果我尝试强制转换它,它就不起作用了

它抛出错误,因为无法将类型a转换为类型b

我为这个错误挣扎了好几个小时

类库项目的我的代码:

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;}
}

匿名类型仅在以下情况下共享相同的编译时类型:

  • 它们共享完全相同的参数名称、类型和顺序
  • 它们存在于同一个组件中
或:

如果程序集中有两个或多个匿名对象初始值设定项,请指定 顺序相同且具有 相同的名称和类型,编译器将对象视为 同样的类型

因此,即使这两种匿名类型看起来完全相同,但就C#和运行时而言,它们是两种完全不同的、不兼容的类型

理想情况下,匿名类型不应该从方法中传回,因为它们(正如您现在发现的)不完全可用

在这种情况下,最好在
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();