C#,如何将对象转换为类类型

4
我正在开发.NET CORE应用程序。我已经声明了一个Object,需要将其转换为Customer类类型。我有一个场景,在该场景中,基于布尔值,我需要更改类型并返回它。 错误
System.InvalidCastException: 'Object must implement IConvertible

客户类

public class Customer
{
    public string Name { get; set; }

    public Customer GetCutsomer(){
             //
    }
}

'对象转换'

public class MyService
{
   public void CastType(){

       Customer obj = new Customer();

       var cus = GetCutsomer();

       Object customer = new Object();

       Convert.ChangeType(customer , cus.GetType());
   }
}

2
客户只是一个对象。你不能将其强制转换为客户,因为它不是一个客户。你可以将其转换为不同的类型,但是为此(如运行时所述),你需要在你的类中实现一个转换方法。但这在这里没有意义。一个对象没有数据可以转换成客户。 - Ralf
2
不清楚你想做什么或为什么要这样做。如果你需要一个Customer实例,为什么不直接创建一个Customer实例呢?为什么要创建一个Object实例? - David
我正在面对别人代码混乱的问题...需要在运行时做出决定,尝试了动态方法但没有成功,会抛出异常。通过条件判断我可以决定传递什么对象,除非有更好的解决方案。 - K.Z
2个回答

4

你有几个选择。让我们创建一个客户对象并将其赋值给对象变量,以消除这一事实。还可以创建一个不是客户的对象,以展示这种情况。

    object o1 = new Customer();
    object o2 = new String("not a customer");

现在我们想要恢复它的“客户”属性

首先,我们可以使用as

    Customer as1 = o1 as Customer;
    Customer as2 = o2 as Customer;
  • as1最终会成为一个有效的Customer指针
  • 由于o2不是一个Customer对象,因此as2最终为null

或者我们可以进行类型转换

    var cast1 = (Customer)o1;
    try {
        var cast2 = (Customer)o2;
    }
    catch {
        Console.WriteLine("nope");
    }
  • 第一个成功
  • 第二个抛出 InvalidCast 异常

我们也可以使用 is 来查询对象

    if (o1 is Customer)
        Console.WriteLine("yup");
    if (o2 is Customer)
        Console.WriteLine("yup");

这也可以(回答评论中的问题)

object o1 = new Customer();

现在

Customer c = (Customer)o1;

稍后再做。
o1 = new Order();
...
Order ord1 = (Order)o1;

一个对象指针可以指向任何对象。

这是继承的作用。在c#中,所有类对象最终都派生自“Object”,只是在您的代码中看不到它。因此,一个对象指针可以指向任何类对象。


我们能否在运行时更改对象 Object o1 = new Object() 的类型?即,将客户对象更改为订单对象。 - K.Z
@K.Z,你不能将一个Customer对象更改为Order对象。像你的“o1”这样的“对象”指针可以指向任一对象。 - pm100

-1

你应该可以安全地将任何对象转换为一个类:

var obj = new Object();
var customer = (Customer)obj;

4
那个演员阵容会失败。 - madreflection
你可以将一个类转换为对象,但你不能将一个对象强制转换为任何类。 - Saggio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接