Language / Dil: English - Turkce
Enum metadata layer for centralized status, message, and info management in .NET
Zero database dependency - cached reflection - safe Try... APIs - typed metadata models.
UmbrellaFrame.EnumMeta lets you decorate enum members with status and info attributes, then resolve messages, severity values, names, and descriptions from one centralized place. It is designed for API responses, stored procedure status codes, workflow outcomes, validation states, and enum-based domain results.
UmbrellaFrame.EnumMeta
-> StatusAttribute, InfoAttribute, StatusType, InfoType
-> GetEnumStatus / TryGetEnumStatus
-> GetStatusMetadata / TryGetStatusMetadata
-> GetEnumInfo / GetEnumInfoOrDefault
-> GetInfoMetadata / TryGetInfoMetadata
The package intentionally stays small. It does not try to become a result framework, ORM, validation framework, or localization system.
Its job is to keep enum-owned metadata close to the enum member that owns it. Boundary values can be unsafe, so every required lookup has a safe Try... alternative. Reflection is cached internally after the first lookup, keeping the public API simple without repeatedly scanning attributes.
dotnet add package UmbrellaFrame.EnumMetausing UmbrellaFrame.EnumMeta.Core;
public enum UserRegistrationStatus
{
[Status("User created successfully.", StatusType.Success)]
Created = 0,
[Status("Email address is already in use.", StatusType.Warning)]
DuplicateEmail = 1,
[Status("User information could not be verified.", StatusType.Error, Code = "USER_VERIFY_FAILED", ExternalCode = "USR-422")]
VerificationFailed = 2
}
var status = UserRegistrationStatus.VerificationFailed;
var metadata = status.GetStatusMetadata();
Console.WriteLine(metadata.Message);
Console.WriteLine(metadata.Code);
Console.WriteLine(metadata.IsError);Boundary-safe usage:
var status = (UserRegistrationStatus)statusCodeFromDatabase;
if (!status.TryGetStatusMetadata(out var metadata))
{
return Results.Problem("Unknown status code returned by the database.");
}
return metadata.IsError
? Results.BadRequest(metadata.Message)
: Results.Ok(metadata.Message);public enum AccountState
{
[Info("Active", "The account can sign in and use the system.")]
Active,
[Info("Suspended", "The account is blocked until manual review.")]
Suspended
}
var info = AccountState.Active.GetInfoMetadata();
Console.WriteLine(info.Name);
Console.WriteLine(info.Description);Fallback reads:
var description = AccountState.Active.GetEnumInfoOrDefault(
InfoType.Description,
"No description available.");EnumMeta does not own your localization or message source. Resolve messages from any source you prefer: .resx, database, JSON, cache, or a remote localization service.
var message = UserRegistrationStatus.VerificationFailed.GetLocalizedMessage(
(status, culture) => myMessageProvider.GetMessage(status.ToString(), culture),
"tr",
"Mesaj bulunamadi.");Use the generic API when you want compile-time types in the returned metadata model.
var metadata = UserRegistrationStatus.VerificationFailed
.GetStatusMetadata<UserRegistrationStatus, StatusType>();
UserRegistrationStatus value = metadata.Value;
StatusType type = metadata.Type;If you used the previous package name, switch to the new package and namespace:
dotnet remove package <previous-package-id>
dotnet add package UmbrellaFrame.EnumMetausing UmbrellaFrame.EnumMeta.Core;| API | Description |
|---|---|
[Status("message", StatusType, Code = "...", ExternalCode = "...")] |
Adds status message, severity, and optional mapping codes |
[Info("name", "description")] |
Adds ordered display metadata |
GetEnumStatus() |
Reads required StatusAttribute |
TryGetEnumStatus(out StatusAttribute) |
Safe status attribute lookup |
GetStatusMetadata() |
Returns typed StatusMetadata |
TryGetStatusMetadata(out StatusMetadata) |
Safe typed status lookup |
GetStatusMetadata<TValue, TType>() |
Returns strongly typed status metadata |
TryGetStatusMetadata<TValue, TType>(out StatusMetadata<TValue, TType>) |
Safe strongly typed status lookup |
GetEnumInfos() |
Reads required info entries |
TryGetEnumInfos(out string[]) |
Safe info array lookup |
GetEnumInfo(InfoType) |
Reads one required info entry |
GetEnumInfoOrDefault(InfoType, string) |
Reads one info entry or fallback |
GetInfoMetadata() |
Returns typed InfoMetadata |
TryGetInfoMetadata(out InfoMetadata) |
Safe typed info lookup |
GetResolvedMessage(Func<Enum, string>, string) |
Resolves a message from a caller-owned source |
GetLocalizedMessage(Func<Enum, CultureInfo, string>, string, string) |
Resolves a localized message from a caller-owned source |
GetLocalizedMessage(ResourceManager, string) |
Reads resource text from a caller-provided resource manager |
dotnet run --project samples/UmbrellaFrame.EnumMeta.StatusMappingExample/UmbrellaFrame.EnumMeta.StatusMappingExample.csprojExpected output:
Error: User information could not be verified.
| Feature | EnumMeta | Switch statements | Full result framework |
|---|---|---|---|
| Enum-owned messages | Yes | Manual | Partial |
| Safe unknown-code handling | Yes | Manual | Yes |
| Cached attribute lookup | Yes | No | Depends |
| Zero database dependency | Yes | Yes | Yes |
| Small API surface | Yes | Yes | No |
| Typed metadata models | Yes | No | Depends |
| Works with numeric boundary codes | Yes | Manual | Yes |
dotnet restore
dotnet build
dotnet testCreate a release package:
dotnet build UmbrellaFrame.EnumMeta.Core/UmbrellaFrame.EnumMeta.Core.csproj -c Release
dotnet pack UmbrellaFrame.EnumMeta.Core/UmbrellaFrame.EnumMeta.Core.csproj -c Release --no-build --output artifacts --include-symbols -p:SymbolPackageFormat=snupkgMIT (c) UmbrellaFrame
.NET icin merkezi enum durum, mesaj ve bilgi metadata katmani
Veritabani bagimliligi yok - cache'li reflection - guvenli Try... API'leri - tiplenmis metadata modelleri.
UmbrellaFrame.EnumMeta, enum uyelerine status ve info attribute'lari ekleyerek mesaj, durum tipi, isim ve aciklama bilgilerini tek merkezden okumanizi saglar. API cevaplari, stored procedure durum kodlari, workflow sonuclari, validasyon durumlari ve enum tabanli domain sonuc akislari icin tasarlanmistir.
Bu paket bilerek kucuk tutulur. Bir result framework, ORM, validasyon framework'u veya tam kapsamli localization sistemi olmaya calismaz.
Amaci, enum'a ait metadata'yi dogrudan enum uyesinin yaninda tutmaktir. Dis sistemlerden gelen durum kodlari guvensiz olabilecegi icin gerekli okuma metotlarinin guvenli Try... alternatifleri vardir. Reflection ilk okumadan sonra cache'lenir.
dotnet add package UmbrellaFrame.EnumMetausing UmbrellaFrame.EnumMeta.Core;
public enum SiparisDurumu
{
[Status("Siparis basariyla olusturuldu.", StatusType.Success)]
Olusturuldu = 0,
[Status("Siparis onay bekliyor.", StatusType.Warning)]
OnayBekliyor = 1,
[Status("Siparis olusturulamadi.", StatusType.Error, Code = "ORDER_CREATE_FAILED", ExternalCode = "ORD-500")]
Olusturulamadi = 2
}
var durum = SiparisDurumu.Olusturulamadi;
var metadata = durum.GetStatusMetadata();
Console.WriteLine(metadata.Message);
Console.WriteLine(metadata.Code);
Console.WriteLine(metadata.IsError);Harici sistemlerden gelen kodlarda guvenli kullanim:
var durum = (SiparisDurumu)veritabanindanGelenDurumKodu;
if (!durum.TryGetStatusMetadata(out var metadata))
{
return Results.Problem("Bilinmeyen durum kodu dondu.");
}
return metadata.IsError
? Results.BadRequest(metadata.Message)
: Results.Ok(metadata.Message);public enum HesapDurumu
{
[Info("Aktif", "Hesap sisteme giris yapabilir.")]
Aktif,
[Info("Askida", "Hesap manuel inceleme bekliyor.")]
Askida
}
var info = HesapDurumu.Aktif.GetInfoMetadata();
Console.WriteLine(info.Name);
Console.WriteLine(info.Description);EnumMeta localization veya mesaj kaynagini sahiplenmez. Mesajlari istediginiz kaynaktan cozebilirsiniz: .resx, veritabani, JSON, cache veya uzak localization servisi.
var mesaj = SiparisDurumu.Olusturulamadi.GetLocalizedMessage(
(durum, culture) => mesajSaglayici.GetMessage(durum.ToString(), culture),
"tr",
"Mesaj bulunamadi.");Donen metadata modelinde compile-time tipler istiyorsaniz generic API'yi kullanabilirsiniz.
var metadata = SiparisDurumu.Olusturulamadi
.GetStatusMetadata<SiparisDurumu, StatusType>();
SiparisDurumu durum = metadata.Value;
StatusType tip = metadata.Type;Eski paket adini kullaniyorsaniz yeni paket ve namespace'e gecin:
dotnet remove package <onceki-paket-id>
dotnet add package UmbrellaFrame.EnumMetausing UmbrellaFrame.EnumMeta.Core;| API | Aciklama |
|---|---|
[Status("mesaj", StatusType, Code = "...", ExternalCode = "...")] |
Durum mesaji, durum tipi ve opsiyonel esleme kodlari ekler |
[Info("isim", "aciklama")] |
Sirali gorunum metadata'si ekler |
GetEnumStatus() |
Zorunlu status attribute'unu okur |
TryGetEnumStatus(out StatusAttribute) |
Guvenli status attribute okuma |
GetStatusMetadata() |
Tiplenmis StatusMetadata dondurur |
TryGetStatusMetadata(out StatusMetadata) |
Guvenli tiplenmis status okuma |
GetStatusMetadata<TValue, TType>() |
Guclu tipli status metadata dondurur |
TryGetStatusMetadata<TValue, TType>(out StatusMetadata<TValue, TType>) |
Guvenli guclu tipli status okuma |
GetEnumInfo(InfoType) |
Tek bir info alanini okur |
GetEnumInfoOrDefault(InfoType, string) |
Info alanini veya fallback degeri dondurur |
GetInfoMetadata() |
Tiplenmis InfoMetadata dondurur |
TryGetInfoMetadata(out InfoMetadata) |
Guvenli tiplenmis info okuma |
GetResolvedMessage(Func<Enum, string>, string) |
Kullaniciya ait bir kaynaktan mesaj cozer |
GetLocalizedMessage(Func<Enum, CultureInfo, string>, string, string) |
Kullaniciya ait bir kaynaktan lokalize mesaj cozer |
| Ozellik | EnumMeta | Switch bloklari | Buyuk result framework |
|---|---|---|---|
| Enum uzerinde merkezi mesaj | Evet | Manuel | Kismen |
| Bilinmeyen kodlarda guvenli okuma | Evet | Manuel | Evet |
| Cache'li attribute okuma | Evet | Hayir | Degisir |
| Veritabani bagimliligi yok | Evet | Evet | Evet |
| Kucuk API yuzeyi | Evet | Evet | Hayir |
| Tiplenmis metadata modeli | Evet | Hayir | Degisir |
MIT (c) UmbrellaFrame