【问题标题】:set property type dynamically in c#在 C# 中动态设置属性类型
【发布时间】:2012-10-23 01:11:25
【问题描述】:

我的数据流出现以下问题:

数据流由一个字典组成,我想动态解析和指定值的类型。

即我的数据流包括:

  • “日期”,“01.01.2000”
  • “姓名”、“乔”
  • “活着”,“真实”
  • “健康”,“100”

现在我想根据这个数据流设置我的泛型类的属性:

class GenericClass
{
    Hashtable genericAttributes;
}

是否有可能通过反射将我的数据流值设置为正确的类型?

我可以试试这样的:

DateTime.TryParse(date, out myDate);

对于日期时间对象,但我认为这在尝试解析双精度、浮点数、int16s、int32s、uint16、...时不起作用。

对此有什么想法?

谢谢和问候

【问题讨论】:

  • 还有Double.TryParseFloat.TryParseShort.TryParseInt32.TryParse等等等等
  • 你从哪里得到最终的Type
  • 是的,我知道,但这会给我留下一个问题,即“2.0”可能会转换为 Int16、浮点数和双精度数。
  • 无论如何它们都是字符串,你需要一种方法来为你的流中的每一个指定目标类型。
  • @ffyhlkain 和 "123" 是双倍的吗?一个浮子?一个整数?一个字节?还是恰好包含数字的字符串?就个人而言,我会说这有点冒险,但是:正如 Cory 所说:如果你想要这样做,只需使用各种 TryParse

标签: c# parsing reflection types properties


【解决方案1】:

我从你的问题中猜想他们都是IConvertible,所以我会在下面的代码示例中做一些事情。这个想法是我指定“想要”的顺序,即按照我想要的类型的顺序,如果它们可以适合多种类型,然后我尝试按该顺序转换它们。

    public class GenericPropClass
    {
        public Type type;
        public object value;
        public string key;
    }

    [TestMethod]
    public void PropertySet()
    {
        var dict = new Dictionary<string, string>();
        var resultingList = new List<GenericPropClass>();
        // Specify the order with most "specific"/"wanted" type first and string last
        var order = new Type[] { typeof(DateTime), typeof(int), typeof(double), typeof(string) }; 

        foreach (var key in dict.Keys)
            foreach (var t in order)
            {
                try
                {
                    var res = new GenericPropClass()
                    {
                        value = Convert.ChangeType(dict[key], t),
                        key = key,
                        type = t,
                    };
                    resultingList.Add(res);
                    break;
                }
                catch (Exception)
                {
                    // Just continue
                }
            }

    }

很抱歉,我的回答几乎只包含代码,我今晚可能有时间改进它,让我思考一下,但我现在必须走了:)

【讨论】:

  • 是的!非常感谢@flindeberg。这正是我想要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 2012-10-09
  • 1970-01-01
  • 2016-02-15
相关资源
最近更新 更多