RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 788203
Accepted
Bulson
Bulson
Asked:2020-02-21 17:54:46 +0000 UTC2020-02-21 17:54:46 +0000 UTC 2020-02-21 17:54:46 +0000 UTC

如何使用 Type 变量进行转换?

  • 772

假设在代码前面的某个地方我保存了变量的类型

Type type = typeof(Int32);

value现在,有了一个类型变量,object我需要type像这样使用我的 c 转换,

var i = (type)value;

但这不起作用。可以做什么?

UPD 以防万一,这也不起作用。

var i = (type)Convert.ChangeType(value, type);

UPD2:应 Pavel Mayorov 的要求,我将我的评论添加到问题中:

“......想法是这样的:有一个带有属性Object Value和属性的基本抽象类Type ValueType。一个继承这个抽象类的具体类,将为该属性分配所需的类型ValueType,并且该属性本身将具有Value重要的价值。此外,当使用从抽象类继承的类型集合时,可以通过从." 中Value获取类型来提取所需类型的值。ValueType

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    tym32167
    2020-02-21T18:45:37Z2020-02-21T18:45:37Z

    让我们做一个小测试

    投射功能:

    object CastTo<T>(object inp)
    {
        return Convert.ChangeType(inp, typeof(T));  
    }
    

    测试本身:

    void Main()
    {
        double d = 99.19;
        Console.WriteLine(d.GetType().Name);
    
        var intVal = CastTo<int>(d);
        Console.WriteLine(intVal.GetType().Name);   
    
        Console.WriteLine(d);       
        Console.WriteLine(intVal);      
    }
    

    控制台输出

    Double
    Int32
    99.19
    99
    

    UPD

    如果您手边没有 Generic 参数,但需要调用 Generic 方法,那么您可以像这样通过 dynamic 来实现:

    void Main()
    {
        object value = 100; 
        CallGenericMethod(value);
    }
    
    public void CallGenericMethod(object inp)
    {
        GenericMethod((dynamic)inp);
    }
    
    public T GenericMethod<T>(T inp) 
    {
        Console.WriteLine($"Generic called! Parameter type {typeof(T).Name}, input type {inp.GetType().Name}");
        return inp;
    }
    

    结论:

    Generic called! Parameter type Int32, input type Int32
    
    • 4
  2. Pavel Mayorov
    2020-02-21T22:26:05Z2020-02-21T22:26:05Z

    编译器无法使用未知类型的变量。任何变量都必须具有在编译时已知的数据类型。

    但是您不需要未知类型的变量:所需的变量类型取决于您打算如何使用它。它总是可以确定的。


    从您的说明中可以看出,您不仅需要创建一个变量,还需要在基类中创建一个属性。这个任务比你想象的要容易:创建一个 type 的抽象属性就足够了object。

    abstract class Foo
    {
        public abstract Type ValueType { get; }
        public abstract object UntypedValue { get; set; }
    }
    

    无需以某种方式另外指出该属性UntypedValue的实际类型ValueType(除非您可以在评论中写下它)。

    好吧,在派生类中,我们只是重载UntypedValue它,使这个属性按我们的需要工作:

    class Foo<T> : Foo
    {
        public override Type ValueType => typeof(T);
        public T Value { get; set; }
        public override object UntypedValue 
        {
            get { return Value; }
            set { Value = (T)value; }
        }
    }
    
    • 4

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5