Meaningless Notebook

我輩は雑記帖である。名はまだない。


超ドハマりした

Enum に文字列を割り当てたくて下記記事を参考にコ-ディングしてたら拡張メソッドが呼び出せなくて超ドハマりした。

C# > enumに文字列を割り当てる。

WebApp/Constants/Helper/StringValue.cs

using System;

namespace WebApp.Constants.Helper
{
    public class StringValueAttribute (string value) : Attribute
    {
        public string StringValue { get; protected set; } = value;
    }

    public static class StringValueAttributeHelper
    {
        public static string GetStringValue(this Enum value)
        {
            Type type = value.GetType();

            System.Reflection.FieldInfo? fieldInfo = type.GetField(value.ToString());

            if (fieldInfo == null) return null;

            StringValueAttribute[] attributes = (StringValueAttribute[]) fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false);

            return attributes.Length > 0 ? attributes[0].StringValue : null;
        }
    }
}

WebApp/Constants/Uri.cs

WebApp.Constants.Helper;

namespace WebApp.Constants
{
    public enum Uri
    {
        [StringValue("/")]
        SIGNIN
    }

    public static class UriEnumHelper
    {
        public static string GetStringValue(this Uri uri)
        {
            return StringValueAttributeHelper.GetStringValue(uri);
        }
    }
}

Visual Studio が警告とか出したから対応したのと写経してる時にオリジナリティ (笑) を出したので参考記事から変わってるけど、実装した Enum が上記。

で、下記だと GetStringValue メソッドが呼べない。

WebApp.Constants.Uri.SIGNIN.GetStringValue();

呼びたい場合は下記の通り。

using WebApp.Constants;

WebApp.Constants.Uri.SIGNIN.GetStringValue();

C# 熟練者だったら当たり前だろ馬鹿か ? って思うだろうけど、C# 1日目の私は超ドハマりした。

でもね Enum にメソッド付けれない C# も悪いんですよ ? (CV.井上)

先が思いやられる…

参考元