using System.Collections;
using System.Collections.Generic;
var fields = new List<IViewModel> {
{ new StringInputViewModel { Name = "StringField", Value = "One" } },
{ new NumberInputViewModel { Name = "NumberField", Value = 2 } },
{ new NameInputViewModel { Name = "NameField", Value = "Three" } },
{ new HiddenViewModel { Name = "HiddenField", Value = "We should not see this!" } },
{ new ListInputViewModel { Name = "ListField", Value = new List<string> { "1", "2", "3" } } }
PrintNamesAndValues(fields);
static void PrintNamesAndValues(IEnumerable<IViewModel> viewModels)
var nameAndValuePairs = viewModels
.Where(DoesViewModelInheritInputViewModel)
foreach (var nameAndValue in nameAndValuePairs)
Console.WriteLine($"{nameAndValue?.Item1} = {nameAndValue?.Item2}");
static Tuple<string, string> GetNameAndValue(IViewModel viewModel)
var type = viewModel.GetType();
var name = type.GetProperty("Name")?.GetValue(viewModel);
var value = type.GetProperty("Value")?.GetValue(viewModel);
if (name == null || value == null)
var valueString = (value.GetType().GetInterface(nameof(ICollection)) != null)
? string.Join(",", ((IEnumerable<object>)value).Select(x => x.ToString()))
return new Tuple<string, string>(name.ToString(), valueString);
static bool DoesViewModelInheritInputViewModel(IViewModel viewModel)
var type = viewModel.GetType();
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(InputViewModel<>))
public interface IViewModel
public class FieldViewModel : IViewModel
public string Name { get; set; }
public class HiddenViewModel : FieldViewModel
public string Value { get; set; }
public class InputViewModel<TModel> : FieldViewModel
public TModel Value { get; set; }
public class StringInputViewModel : InputViewModel<string>
public class NumberInputViewModel : InputViewModel<int>
public class NameInputViewModel : StringInputViewModel
public class ListInputViewModel : InputViewModel<List<string>>