ホームページ >バックエンド開発 >C#.Net チュートリアル >C#の動的型と動的オブジェクトの作成、2つのオブジェクトのマージ、およびマップのサンプルコードの詳細な説明
次のエディターは、記事 c#動的タイプ、および動的オブジェクトの作成、2 つのオブジェクトの結合、およびマップ インスタンスを提供します。編集者はこれがとても良いと思ったので、参考として共有します。編集者をフォローして見てみましょう
クライアントからリクエストされたデータに応答するとき、たとえばデータベース内のデータが int 型であるなど、データを処理する必要がある場合があります。列挙、またはその他の論理的な意味 (データベースの設計はデータ セキュリティ、ストレージ容量などの観点から行われる場合があります) ですが、その特定の意味はクライアントに表示される必要があります。
この時の処理方法は一般的に2です。複雑で単一のロジックでない場合は、SQL文を直接変更することでデータソースを処理できます。このとき、コード内で何も処理する必要はありません。
しかし、ロジックが少し複雑だったり、判断状況に分岐が多かったりする場合は、コードの観点から対処する必要があります。単一のオブジェクトは問題ありませんが、リスト8742468051c85b06f0a0af9e3e506b5c など複数のオブジェクトがある場合は、特定のオブジェクトのフィールドで XXX をループする必要があります。 その後、Arg の中間オブジェクトである DTO が登場しました。もちろん、私はこのデザインが個人的に気に入っていますが、時々めんどくさいので書きたくないことがあります (ほとんどの場合、量産用のコード ジェネレーターを直接書きます)。 ) たとえば、テストするとき、個人的な作業を行うとき、デモンストレーションを行うとき、目的の効果をすぐに提示するだけでは、面倒なので、市場には次のようなマップ ライブラリがあまりないと言うでしょう。 automap や tinymap 、さらには
json.net の動的機能を書き換えるなど、さまざまな方法がありますが、そのような小さなことを行うために大きなホイールを使用する価値はないと思います。ホイールが大きくなればなるほど、やるべきことは増えますが、それほど複雑にはしたくありません。
具体的なコードを以下に示します。理解していれば、必要な効果に合わせて簡単に拡張または変更できます。using System.Dynamic;
using System.Reflection;
using System.Collections.Concurrent;
private static readonly ConcurrentDictionary<RuntimeTypeHandle, PropertyInfo[]>
DynamicObjectProperties = new ConcurrentDictionary<RuntimeTypeHandle, PropertyInfo[]>();
private IDictionary<string, Object> ToDynamicResult<T>(T classobj, Func<string, object, object> injectAct)
where T : IInjectClass, new()
{
var type = typeof(T);
var key = type.TypeHandle;
var dynamicResult = new ExpandoObject() as IDictionary<string, Object>;
PropertyInfo[] queryPts = null;
DynamicObjectProperties.TryGetValue(key, out queryPts);
if (queryPts == null)
{
queryPts = type.GetProperties();
DynamicObjectProperties.TryAdd(key, queryPts);
}
foreach (var p in queryPts)
{
var attributes = p.GetCustomAttributes(typeof(IngorePropertyAttribute), true);
var columnMapping = attributes.FirstOrDefault();
if (columnMapping != null) continue;
var _name = p.Name;
var _value = p.GetValue(classobj, null);
object _tempvalue = _value;
if (injectAct != null) _tempvalue = injectAct.Invoke(_name, _value);
//var value = Convert.ChangeType(value,typeof(string));
dynamicResult.Add(p.Name, _tempvalue);
}
return dynamicResult;
}
/// <summary>
/// 支持动态输出的对象接口
/// </summary>
public interface IInjectClass
{
}
/// <summary>
/// 动态输出时忽略此标记的属性
/// </summary>
public class IngorePropertyAttribute : Attribute
{
}
以下のテストをしてみましょう: public class kk : IInjectClass
{
public string aa { get; set; }
public int bb { get; set; }
[IngoreProperty]
public bool cc { get; set; }
public DateTime dd { get; set; }
}kk ist = new kk();
ist.aa = "aaa";
ist.bb = 123;
ist.cc = false;
ist.dd = DateTime.Now;
var tt = ToDynamicResult<kk>(ist, (k, v) =>
{
if (k != "aa") return v;
return v + "(改变了哦)";
});
var json = Tools.JsonUtils.JsonSerializer(tt);
json = json + "<br /><br />" + Tools.JsonUtils.JsonSerializer(ToDynamicResult<kk>(
new kk
{
aa = "test",
bb = 789,
cc = true,
dd = DateTime.Now.AddDays(2)
}, null));
Response.Write(json);
パラメータを使用して特性を再構築することも、独自のものに合わせて injectAct オブジェクトを変更することもできます
以下のテストを作成し、それを
expression を入力してテストします: List<KeyValue> kk = new List<KeyValue>
{
new KeyValue{key="aaa", value="111"},
new KeyValue{key="bbb", value="222"},
new KeyValue{key="ccc", value="333"},
new KeyValue{key="ddd", value="444"},
};
var result = Class2Map.MergerListObject<KeyValue, dynamic>(kk, new { p = "jon test" });
var json = JsonUtils.JsonSerializer(result);
Response.Write(json);
出力は次のとおりです:
[{"key":"aaa","value":"111","p":"jon test"}, {"key":"bbb","value":"222","p":"jon test"}, {"key":"ccc","value":"333","p":"jon test"}, {"key":"ddd","value":"444","p":"jon test"}] var result = Class2Map.MergerObject<KeyValue, dynamic>( new KeyValue { key = "aaa", value = "111" }, new { p = "jon test" } ); var json = JsonUtils.JsonSerializer(result); Response.Write(json);
出力は次のとおりです:
{ "key": "aaa", "value": "111", "p": "jon test" }
以上がC#の動的型と動的オブジェクトの作成、2つのオブジェクトのマージ、およびマップのサンプルコードの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。