UEnum::GetEnumName fails for inconsistent enums

Using function from [this guide][1] to convert enum values to strings:

template<typename TEnum>
FString GetEnumValueAsString(const FString& Name, TEnum Value)
{
    const UEnum* enumPtr = FindObject<UEnum>(ANY_PACKAGE, *Name, true);
    if (!enumPtr)
    {
        return FString("Invalid");
    }

    return enumPtr->GetEnumName((int32)Value);
}

The enum is:

UENUM(BlueprintType)
enum class ETestEnum : uint8
{
    Unknown                 UMETA(Hidden),
    Value1                  UMETA(DisplayName = "Value1"),
    Value2                  UMETA(DisplayName = "Value2"),
    Value3 = 20             UMETA(DisplayName = "Value3"),
    Value4                  UMETA(DisplayName = "Value4"),

    MAX                     UMETA(Hidden),
};

Using following to output on the screen:

GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT("[%s] [%s] [%s] [%s] [%s]")
        , *GetEnumValueAsString<ETestEnum>("ETestEnum", ETestEnum::Unknown)
        , *GetEnumValueAsString<ETestEnum>("ETestEnum", ETestEnum::Value1)
        , *GetEnumValueAsString<ETestEnum>("ETestEnum", ETestEnum::Value2)
        , *GetEnumValueAsString<ETestEnum>("ETestEnum", ETestEnum::Value3)
        , *GetEnumValueAsString<ETestEnum>("ETestEnum", ETestEnum::Value4)
        ));

The result is:

82077-enum.png

Is this known issue or am I doing something wrong?

ok, after some digging here is my workaround:

template<typename TEnum>
FString GetEnumValueAsString(const FString& Name, TEnum Value)
{
    const UEnum* enumPtr = FindObject<UEnum>(ANY_PACKAGE, *Name, true);
    if (!enumPtr)
    {
        return FString("Invalid");
    }

    auto index = enumPtr->GetIndexByValue((uint8)Value);
    return enumPtr->GetEnumName(index);
}

You can also use UEnum::GetEnumNameStringByValue to simplify it.
(UEnum::GetEnumNameStringByValue | Unreal Engine Documentation)