22using System . Collections ;
33using System . Collections . Generic ;
44using System . Linq ;
5+ using System . Reflection ;
56using System . Security . Cryptography ;
67using System . Text ;
78using Typescriptr . Exceptions ;
@@ -25,7 +26,9 @@ public class TypeScriptGenerator
2526 private FormatEnumProperty _enumPropertyFormatter ;
2627 private FormatDictionaryProperty _dictionaryPropertyFormatter ;
2728 private FormatCollectionProperty _collectionPropertyFormatter ;
28-
29+
30+ private QuoteStyle _quoteStyle ;
31+ private MemberType _memberTypes ;
2932 private bool _useCamelCasePropertyNames ;
3033
3134 private readonly Dictionary < Type , string > _propTypeMap = new Dictionary < Type , string > ( )
@@ -61,11 +64,18 @@ private TypeScriptGenerator()
6164 . WithEnumFormatter ( EnumFormatter . ValueNamedEnumFormatter ,
6265 EnumFormatter . UnionStringEnumPropertyTypeFormatter )
6366 . WithQuoteStyle ( QuoteStyle . Single )
67+ . WithTypeMembers ( MemberType . PropertiesOnly )
6468 . WithDictionaryPropertyFormatter ( DictionaryPropertyFormatter . KeyValueFormatter )
6569 . WithCollectionPropertyFormatter ( CollectionPropertyFormatter . Format )
6670 . WithNamespace ( "Api" )
6771 . WithCamelCasedPropertyNames ( ) ;
6872
73+ public TypeScriptGenerator WithTypeMembers ( MemberType memberTypes )
74+ {
75+ _memberTypes = memberTypes ;
76+ return this ;
77+ }
78+
6979 public TypeScriptGenerator WithCamelCasedPropertyNames ( bool useCamelCasedPropertyNames = true )
7080 {
7181 _useCamelCasePropertyNames = useCamelCasedPropertyNames ;
@@ -118,7 +128,7 @@ public TypeScriptGenerator WithPropertyTypeFormatter<TType>(Func<Type, string> c
118128 private readonly HashSet < string > _enumNames = new HashSet < string > ( ) ;
119129 private readonly Stack < Type > _typeStack = new Stack < Type > ( ) ;
120130 private string _namespace ;
121- private QuoteStyle _quoteStyle ;
131+
122132
123133 public GenerationResult Generate ( IEnumerable < Type > types )
124134 {
@@ -159,18 +169,27 @@ private void RenderEnum(StringBuilder builder, Type enumType)
159169
160170 private void RenderType ( StringBuilder builder , Type type )
161171 {
162- var properties = type . GetProperties ( ) ;
172+ var memberTypesToInclude = _memberTypes == MemberType . PropertiesOnly
173+ ? MemberTypes . Property
174+ : MemberTypes . Property | MemberTypes . Field ;
175+
176+ var members = type . GetMembers ( ) . Where ( m => memberTypesToInclude . HasFlag ( m . MemberType ) ) ;
163177 builder . AppendLine ( $ "interface { type . Name } {{") ;
164178
165- foreach ( var prop in properties )
179+ foreach ( var memberInfo in members )
166180 {
167- var propType = prop . PropertyType ;
168- var propName = prop . Name ;
169-
181+ Type memberType = null ;
182+ if ( memberInfo is PropertyInfo p )
183+ memberType = p . PropertyType ;
184+ else if ( memberInfo is FieldInfo f )
185+ memberType = f . FieldType ;
186+ if ( memberType == null ) throw new InvalidOperationException ( ) ;
187+
188+ var memberName = memberInfo . Name ;
170189 if ( _useCamelCasePropertyNames )
171- propName = propName . ToCamelCase ( ) ;
190+ memberName = memberName . ToCamelCase ( ) ;
172191
173- RenderProperty ( builder , propType , propName ) ;
192+ RenderProperty ( builder , memberType , memberName ) ;
174193 }
175194
176195 builder . AppendLine ( "}" ) ;
0 commit comments