【问题标题】:Convert Type to myType将类型转换为 myType
【发布时间】:2017-07-10 02:47:14
【问题描述】:

我想为Object 中的所有decimal 字段设置默认值。方法如下:

private Type SetAllFieldsAsDefault(Type register)
{
    var fields = register.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
    foreach (var field in fields)
    {
        if (field.FieldType != typeof(double)) continue;
        field.SetValue(field, 0);
    }
    return register;
}

在我尝试投射到 myType 之后,但它不起作用

myType = (MyType )SetAllFieldsAsDefault(myType.GetType());

我该怎么做?

【问题讨论】:

  • 你没有给它设置值的实际对象,你只是返回一个Type。它不能被投射到你拥有的实际对象中。 SetValue 应该将实际对象作为第一个参数。
  • 我不知道这段代码要做什么。您不能在类型上设置实例值。而field.SetValue(field, 0) 是完全错误的。见the documentation

标签: c# reflection types casting


【解决方案1】:

你需要一个对象作为输入和输出

 private object SetAllFieldsAsDefault(object _register)
 {
      Type register = _register.GetType();

你会在上面的方法中设置它的值

      field.SetValue(_register, 0);

最后链接修改后的输入

return _register;
}

调用方法

myType = (MyType)SetAllFieldsAsDefault(myType);

这是test online

public static void Main()
{
    var myType = new MyType();
    Console.WriteLine(myType.one + " " + myType.two);
    Console.WriteLine("before");
    myType = SetAllFieldsAsDefault(myType) as MyType;
    Console.WriteLine("after");
    Console.WriteLine(myType.one + " " + myType.two);
}

class MyType {
    internal double one = -1.1;
    internal string test = "hi";
    internal double two = 3.3;
}

输出是

before
-1.1 3.3
after
0 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多