Основываясь на великом ответе Тодда , который построен на большом ответе Aydin , здесь есть метод расширения generic , который не требует каких-либо параметров типа.
///
/// Gets human-readable version of enum.
///
/// DisplayAttribute.Name property of given enum.
public static string GetDisplayName(this T enumValue) where T : IComparable, IFormattable, IConvertible
{
if (!typeof(T).IsEnum)
throw new ArgumentException("Argument must be of type Enum");
DisplayAttribute displayAttribute = enumValue.GetType()
.GetMember(enumValue.ToString())
.First()
.GetCustomAttribute();
string displayName = displayAttribute?.GetName();
return displayName ?? enumValue.ToString();
}
Мне это понадобилось для моего проекта, потому что что-то вроде кода ниже, где не каждый член перечисления имеет DisplayAttribute
, не работает с решением Тодда:
public class MyClass
{
public enum MyEnum
{
[Display(Name="ONE")]
One,
// No DisplayAttribute
Two
}
public void UseMyEnum()
{
MyEnum foo = MyEnum.One;
MyEnum bar = MyEnum.Two;
Console.WriteLine(foo.GetDisplayName());
Console.WriteLine(bar.GetDisplayName());
}
}
// Output:
//
// ONE
// Two
Если это сложное решение простой проблемы, сообщите мне, но это было исправление, которое я использовал.
Уже нашли, как заставить это работать, кажется, что нам нужно вернуть int в нашем методе get, который мы получаем из строки параметров paramst вместо строки, я использовал asp net core 2.2, чтобы сделать мой URL обратного вызова. Вот посмотрите мой пример кода для сохранения в базе данных тоже
[HttpGet]
public int Get()
{
int validationToken = Convert.ToInt32(HttpContext.Request.Query["validationToken"]);
return validationToken;
}
[HttpPost]
public void Post([FromBody]JObject rawBody)
{
using (TheoDBContext db = new TheoDBContext())
{
var jsonData = rawBody["data"];
string name = rawBody["fromUserName"].ToString();
string title = jsonData["title"].ToString();
Kaizala newKaizala = new Kaizala();
newKaizala.Name = name;
newKaizala.Question = title;
newKaizala.Answer = "yes";
db.Kaizala.Add(newKaizala);
db.SaveChanges();
}
}
Это не факт, что вы возвращаетесь int
, что это сработало.
Первая попытка не удалась из-за ошибки при вызове
Request.Headers.GetValues("validationToken").FirstOrDefault().ToString();
Скорее всего, исключение нулевой ссылки, поскольку вы пытались получить доступ к токену в заголовке, в то время как связанная документация сообщает
Kaizala сгенерирует токен проверки и отправит GET-запрос вашему веб-крюку с параметром запроса «validationToken».
blockquote>выделение мин
, которого избегали в обновленном используемом
HttpContext.Request.Query["validationToken"]
Я бы предложил обновить синтаксис to
[HttpGet] public IActionResult Get() { var validationToken = Request.Query["validationToken"]; return Content(validationToken); }
Конечно, вы можете выполнить рефакторинг, чтобы добавить код проверки для ожидаемого параметра строки запроса.
Я предлагаю выше, потому что нет никакой гарантии, что токен будет действительным
int
на основании документации. И даже если это так, этот подход был бы более гибким, если бы они когда-либо отказались от использования целых чисел в качестве токенов.В требованиях просто говорится
Предполагается, что ваша служба возвращает токен проверки (полученный в запросе) в теле ответа в виде простого текста
blockquote>с это, только вернуть именно то, что было отправлено. Не пытайтесь вносить в него какие-либо изменения.