asp.net C# 反射設定未知類型欄位的值

來源:互聯網
上載者:User

只需要使用Convert.ChangeType即可

C#

var eval = new DataTable();
var objType = order.GetType();
var propertyVal = objType.GetProperty(propertyName[1]);
if (propertyVal != null)
{
    var val = propertyVal.GetValue(order, null).ToString();
    //TODO: 神奇的方法
    var result = eval.Compute(
        $"{val} {action["Expression"].Value<string>()} {action["Value"].Value<string>()}",
        "");
    propertyVal.SetValue(order, Convert.ChangeType(result, propertyVal.PropertyType), null);
}

想知道ChangeType是怎麼實現的?其實就是封裝了一堆判斷hhhh
C#


public static object ChangeType(object value, TypeCode typeCode, IFormatProvider provider)
{
    if (value == null && (typeCode == TypeCode.Empty || typeCode == TypeCode.String || typeCode == TypeCode.Object))
    {
        return null;
    }
    IConvertible convertible = value as IConvertible;
    if (convertible == null)
    {
        throw new InvalidCastException(Environment.GetResourceString("InvalidCast_IConvertible"));
    }
    switch (typeCode)
    {
        case TypeCode.Empty:
        {
            throw new InvalidCastException(Environment.GetResourceString("InvalidCast_Empty"));
        }
        case TypeCode.Object:
        {
            return value;
        }
        case TypeCode.DBNull:
        {
            throw new InvalidCastException(Environment.GetResourceString("InvalidCast_DBNull"));
        }
        case TypeCode.Boolean:
        {
            return convertible.ToBoolean(provider);
        }
        case TypeCode.Char:
        {
            return convertible.ToChar(provider);
        }
        case TypeCode.SByte:
        {
            return convertible.ToSByte(provider);
        }
        case TypeCode.Byte:
        {
            return convertible.ToByte(provider);
        }
        case TypeCode.Int16:
        {
            return convertible.ToInt16(provider);
        }
        case TypeCode.UInt16:
        {
            return convertible.ToUInt16(provider);
        }
        case TypeCode.Int32:
        {
            return convertible.ToInt32(provider);
        }
        case TypeCode.UInt32:
        {
            return convertible.ToUInt32(provider);
        }
        case TypeCode.Int64:
        {
            return convertible.ToInt64(provider);
        }
        case TypeCode.UInt64:
        {
            return convertible.ToUInt64(provider);
        }
        case TypeCode.Single:
        {
            return convertible.ToSingle(provider);
        }
        case TypeCode.Double:
        {
            return convertible.ToDouble(provider);
        }
        case TypeCode.Decimal:
        {
            return convertible.ToDecimal(provider);
        }
        case TypeCode.DateTime:
        {
            return convertible.ToDateTime(provider);
        }
        case TypeCode.Object | TypeCode.DateTime:
        {
            throw new ArgumentException(Environment.GetResourceString("Arg_UnknownTypeCode"));
        }
        case TypeCode.String:
        {
            return convertible.ToString(provider);
        }
        default:
        {
            throw new ArgumentException(Environment.GetResourceString("Arg_UnknownTypeCode"));
        }
    }
}
上面的代碼不知道各位朋友有沒有看懂哦,做起來其實是非常的簡單了就一個條件判斷了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.