#c# #asp.net #asp.net-mvc #model-binding #custom-model-binder
#c# #asp.net #asp.net-mvc #привязка к модели #custom-model-binder
Вопрос:
У меня есть struct
такой:
public struct MyStructlt;Tgt; where T: struct, IComparable { //... }
Я хочу написать привязку модели, которая работает для любого типа T
, передаваемого в качестве аргумента универсального типа, в MyStructlt;Tgt;
Вот модель связующего, которую я написал до сих пор:
public class MyStructModelBinder : IModelBinder { public static readonly Type[] SUPPORTED_TYPES = new Type[] { typeof(MyStructlt;gt;) }; public Task BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext == null) { throw new ArgumentNullException(nameof(bindingContext)); } if (!SUPPORTED_TYPES.Contains(bindingContext.ModelType)) { return Task.CompletedTask; } if (!(bindingContext.ModelType.IsGenericType amp;amp; bindingContext.ModelType.GetGenericTypeDefinition() == typeof(MyStructlt;gt;))) { return Task.CompletedTask; } var modelName = bindingContext.BinderModelName ?? bindingContext.ModelName; var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName); if (valueProviderResult == ValueProviderResult.None) { return Task.CompletedTask; } bindingContext.ModelState.SetModelValue(modelName, valueProviderResult); var stringToParse = valueProviderResult.FirstValue; if (string.IsNullOrEmpty(stringToParse)) { return Task.CompletedTask; } /* * This is the problematic part var interval = MyStruct.TryParselt;gt;(bindingContext, intervalToParse); if (interval == null) { return Task.CompletedTask; } bindingContext.Result = ModelBindingResult.Success(interval); */ return Task.CompletedTask; } }
Проблема в том, что я не знаю, как передать аргумент типа синтаксическому анализатору. На самом деле это T
может быть что угодно, может иметь свои собственные связующие. Как я могу создать экземпляр T
, не зная, что это такое? или как я могу перейти T
к синтаксическому анализатору внутри ModelBinder?