potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

C# System.Drawing.Imaging.PropertyDataのインスタンスを作成する

System.Drawing.Imaging.PropertyDataJPEGファイルのEXIFデータを取得・設定する際に必要ですが、コンストラクタが非公開なので通常の方法ではインスタンスを作成できません。これはSystem.Runtime.Serialization.FormatterServicesGetSafeUninitializedObjectメソッドで回避できます。

#nullable enable

using System.Diagnostics;
using System.Drawing.Imaging;
using System.Runtime.Serialization;

var propItem = CreatePropertyItem();

Debugger.Break();

static PropertyItem CreatePropertyItem()
{
    return (PropertyItem)FormatterServices.GetSafeUninitializedObject(typeof(PropertyItem));
}

GetUninitializedObjectメソッドでも可能です。GetSafeUninitializedObjectメソッドはCLR型専用ですが、こちらは非CLR型でも使えます。

#nullable enable

using System.Diagnostics;
using System.Drawing.Imaging;
using System.Runtime.Serialization;

var propItem = CreatePropertyItem();

Debugger.Break();

static PropertyItem CreatePropertyItem()
{
    return (PropertyItem)FormatterServices.GetUninitializedObject(typeof(PropertyItem));
}

参考リンク