potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

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));
}

参考リンク