-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
16 changed files
with
891 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,56 @@ | ||
Singulink.Reflection.Caster | ||
# Singulink.Reflection.Caster | ||
|
||
[](https://gitter.im/Singulink/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) | ||
[](https://www.nuget.org/packages/Singulink.Reflection.Caster/) | ||
[](https://github.com/Singulink/Singulink.Reflection.Caster/actions?query=workflow%3A%22build+and+test%22) | ||
|
||
This library provides dynamic and generic casting capabilities between types determined at runtime. The casting functionality is provided by cached delegates created from compiled expressions so the casts are very fast - the only overhead is a delegate call if you use the generic methods. Both checked and unchecked casts are supported. | ||
|
||
## Installation | ||
|
||
Simply install the `Singulink.Reflection.Caster` package from NuGet into your project. | ||
|
||
Supported Runtimes: Anywhere .NET Standard 2.0 is supported, including .NET Framework 4.6.1+ and .NET Core 2.0+. | ||
|
||
## Usage | ||
|
||
All the functionality is exposed via static methods the `Caster` class. If the types are statically known then the generic methods are the fastest and easiest to use. For example, if you wanted to write a method that converts a generic value to a generic enum, you could do this: | ||
|
||
```c# | ||
// Convert input to an enum type: | ||
public static TEnum ToEnum<TValue, TEnum>(TValue value) | ||
where TValue : unmanaged | ||
where TEnum : Enum | ||
{ | ||
return Caster.Cast<TValue, TEnum>(value); | ||
} | ||
``` | ||
|
||
If the types are not known statically then there are a set of dynamic cast methods that can be used. For example: | ||
|
||
```c# | ||
object intValue = 123456; | ||
|
||
// Cast intValue to decimal: | ||
object decimalValue = Caster.DynamicCast(intValue, typeof(decimal)); | ||
|
||
// Cast intValue to a byte: | ||
object byteValue = Caster.DynamicCheckedCast(intValue, typeof(byte)); // OverflowException | ||
object byteValue = Caster.DynamicCast(intValue, typeof(byte)); // byteValue = 64 | ||
``` | ||
|
||
The dynamic cast methods above call `GetType()` on the value and then perform a fast dictionary lookup to get a cached caster delegate that converts between the types, but you can also grab the caster delegate and store it in a field to avoid the cache lookup: | ||
|
||
```c# | ||
|
||
// Store the caster delegate: | ||
Func<object, object> caster = Caster.GetCaster(typeof(int), typeof(byte)); | ||
|
||
// Use the caster delegate directly: | ||
object intValue = 123456; | ||
object byteValue = caster.Invoke(intValue); | ||
``` |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,328 @@ | ||
# Remove the line below if you want to inherit .editorconfig settings from higher directories | ||
root = true | ||
|
||
|
||
########### All files ########### | ||
[*] | ||
|
||
#### Guidelines #### | ||
|
||
guidelines = 160 | ||
|
||
########### C# files ########### | ||
[*.cs] | ||
|
||
#### Core EditorConfig Options #### | ||
|
||
# Indentation and spacing | ||
indent_size = 4 | ||
indent_style = space | ||
tab_width = 4 | ||
|
||
# New line preferences | ||
end_of_line = crlf | ||
insert_final_newline = false | ||
|
||
#### .NET Coding Conventions #### | ||
|
||
# Organize usings | ||
dotnet_separate_import_directive_groups = false | ||
dotnet_sort_system_directives_first = true | ||
|
||
# this. and Me. preferences | ||
dotnet_style_qualification_for_event = false:warning | ||
dotnet_style_qualification_for_field = false:warning | ||
dotnet_style_qualification_for_method = false:warning | ||
dotnet_style_qualification_for_property = false:warning | ||
|
||
# Language keywords vs BCL types preferences | ||
dotnet_style_predefined_type_for_locals_parameters_members = true:silent | ||
dotnet_style_predefined_type_for_member_access = true:silent | ||
|
||
# Parentheses preferences | ||
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent | ||
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent | ||
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent | ||
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent | ||
|
||
# Modifier preferences | ||
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent | ||
|
||
# Expression-level preferences | ||
dotnet_style_coalesce_expression = true:suggestion | ||
dotnet_style_collection_initializer = true:suggestion | ||
dotnet_style_explicit_tuple_names = true:suggestion | ||
dotnet_style_null_propagation = true:suggestion | ||
dotnet_style_object_initializer = true:suggestion | ||
dotnet_style_prefer_auto_properties = false:silent | ||
dotnet_style_prefer_compound_assignment = true:suggestion | ||
dotnet_style_prefer_conditional_expression_over_assignment = true:silent | ||
dotnet_style_prefer_conditional_expression_over_return = true:silent | ||
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion | ||
dotnet_style_prefer_inferred_tuple_names = true:suggestion | ||
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion | ||
|
||
# Field preferences | ||
# Incorrectly triggered on ref returned fields but Roslynator already handles this correctly | ||
dotnet_style_readonly_field = true:none | ||
|
||
# Parameter preferences | ||
dotnet_code_quality_unused_parameters = all:suggestion | ||
|
||
#### C# Coding Conventions #### | ||
|
||
# var preferences | ||
csharp_style_var_elsewhere = false:silent | ||
csharp_style_var_for_built_in_types = false:suggestion | ||
csharp_style_var_when_type_is_apparent = true:suggestion | ||
|
||
# Expression-bodied members | ||
csharp_style_expression_bodied_accessors = true:suggestion | ||
csharp_style_expression_bodied_constructors = false:silent | ||
csharp_style_expression_bodied_indexers = true:suggestion | ||
csharp_style_expression_bodied_lambdas = true:silent | ||
csharp_style_expression_bodied_local_functions = false:silent | ||
csharp_style_expression_bodied_methods = false:silent | ||
csharp_style_expression_bodied_operators = true:silent | ||
csharp_style_expression_bodied_properties = true:suggestion | ||
|
||
# Pattern matching preferences | ||
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion | ||
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion | ||
csharp_style_prefer_switch_expression = true:suggestion | ||
|
||
# Null-checking preferences | ||
csharp_style_conditional_delegate_call = true:suggestion | ||
|
||
# Modifier preferences | ||
csharp_prefer_static_local_function = true:suggestion | ||
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async | ||
|
||
# Code-block preferences | ||
csharp_prefer_braces = false:silent | ||
csharp_prefer_simple_using_statement = true:suggestion | ||
|
||
# Expression-level preferences | ||
csharp_prefer_simple_default_expression = true:suggestion | ||
csharp_style_deconstructed_variable_declaration = true:suggestion | ||
csharp_style_inlined_variable_declaration = true:suggestion | ||
csharp_style_pattern_local_over_anonymous_function = true:suggestion | ||
csharp_style_prefer_index_operator = true:suggestion | ||
csharp_style_prefer_range_operator = true:suggestion | ||
csharp_style_throw_expression = true:suggestion | ||
csharp_style_unused_value_assignment_preference = discard_variable:suggestion | ||
csharp_style_unused_value_expression_statement_preference = discard_variable:silent | ||
|
||
# 'using' directive preferences | ||
csharp_using_directive_placement = outside_namespace:silent | ||
|
||
#### C# Formatting Rules #### | ||
|
||
# New line preferences | ||
csharp_new_line_before_catch = true | ||
csharp_new_line_before_else = true | ||
csharp_new_line_before_finally = true | ||
csharp_new_line_before_members_in_anonymous_types = true | ||
csharp_new_line_before_members_in_object_initializers = true | ||
csharp_new_line_before_open_brace = methods,types | ||
csharp_new_line_between_query_expression_clauses = true | ||
|
||
# Indentation preferences | ||
csharp_indent_block_contents = true | ||
csharp_indent_braces = false | ||
csharp_indent_case_contents = true | ||
csharp_indent_case_contents_when_block = true | ||
csharp_indent_labels = no_change | ||
csharp_indent_switch_labels = true | ||
|
||
# Space preferences | ||
csharp_space_after_cast = false | ||
csharp_space_after_colon_in_inheritance_clause = true | ||
csharp_space_after_comma = true | ||
csharp_space_after_dot = false | ||
csharp_space_after_keywords_in_control_flow_statements = true | ||
csharp_space_after_semicolon_in_for_statement = true | ||
csharp_space_around_binary_operators = before_and_after | ||
csharp_space_around_declaration_statements = false | ||
csharp_space_before_colon_in_inheritance_clause = true | ||
csharp_space_before_comma = false | ||
csharp_space_before_dot = false | ||
csharp_space_before_open_square_brackets = false | ||
csharp_space_before_semicolon_in_for_statement = false | ||
csharp_space_between_empty_square_brackets = false | ||
csharp_space_between_method_call_empty_parameter_list_parentheses = false | ||
csharp_space_between_method_call_name_and_opening_parenthesis = false | ||
csharp_space_between_method_call_parameter_list_parentheses = false | ||
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false | ||
csharp_space_between_method_declaration_name_and_open_parenthesis = false | ||
csharp_space_between_method_declaration_parameter_list_parentheses = false | ||
csharp_space_between_parentheses = false | ||
csharp_space_between_square_brackets = false | ||
|
||
# Wrapping preferences | ||
csharp_preserve_single_line_blocks = true | ||
csharp_preserve_single_line_statements = false | ||
|
||
#### Naming styles #### | ||
|
||
# Naming rules | ||
dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning | ||
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface | ||
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i | ||
|
||
dotnet_naming_rule.types_should_be_pascalcase.severity = warning | ||
dotnet_naming_rule.types_should_be_pascalcase.symbols = types | ||
dotnet_naming_rule.types_should_be_pascalcase.style = pascalcase | ||
|
||
dotnet_naming_rule.constant_field_should_be_pascalcase.severity = warning | ||
dotnet_naming_rule.constant_field_should_be_pascalcase.symbols = constant_field | ||
dotnet_naming_rule.constant_field_should_be_pascalcase.style = pascalcase | ||
|
||
dotnet_naming_rule.non_field_members_should_be_pascalcase.severity = warning | ||
dotnet_naming_rule.non_field_members_should_be_pascalcase.symbols = non_field_members | ||
dotnet_naming_rule.non_field_members_should_be_pascalcase.style = pascalcase | ||
|
||
# Symbol specifications | ||
dotnet_naming_symbols.interface.applicable_kinds = interface | ||
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal | ||
dotnet_naming_symbols.interface.required_modifiers = | ||
|
||
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum | ||
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal | ||
dotnet_naming_symbols.types.required_modifiers = | ||
|
||
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method | ||
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal | ||
dotnet_naming_symbols.non_field_members.required_modifiers = | ||
|
||
dotnet_naming_symbols.constant_field.applicable_kinds = field | ||
dotnet_naming_symbols.constant_field.applicable_accessibilities = public, internal, private, protected, protected_internal | ||
dotnet_naming_symbols.constant_field.required_modifiers = const | ||
|
||
# Naming styles | ||
dotnet_naming_style.pascalcase.required_prefix = | ||
dotnet_naming_style.pascalcase.required_suffix = | ||
dotnet_naming_style.pascalcase.word_separator = | ||
dotnet_naming_style.pascalcase.capitalization = pascal_case | ||
|
||
dotnet_naming_style.begins_with_i.required_prefix = I | ||
dotnet_naming_style.begins_with_i.required_suffix = | ||
dotnet_naming_style.begins_with_i.word_separator = | ||
dotnet_naming_style.begins_with_i.capitalization = pascal_case | ||
|
||
|
||
#### Analyzer diagnostics #### | ||
|
||
# SA1503: Braces should not be omitted | ||
dotnet_diagnostic.SA1503.severity = none | ||
|
||
# SA1615: Element return value should be documented | ||
dotnet_diagnostic.SA1615.severity = silent | ||
|
||
# SA1101: Prefix local calls with this | ||
dotnet_diagnostic.SA1101.severity = none | ||
|
||
# RCS1140: Add exception to documentation comment. | ||
dotnet_diagnostic.RCS1140.severity = none | ||
|
||
# SA1128: Put constructor initializers on their own line | ||
dotnet_diagnostic.SA1128.severity = none | ||
|
||
# SA1200: Using directives should be placed correctly | ||
dotnet_diagnostic.SA1200.severity = none | ||
|
||
# SA1618: Generic type parameters should be documented | ||
dotnet_diagnostic.SA1618.severity = suggestion | ||
|
||
# CA1303: Do not pass literals as localized parameters | ||
dotnet_diagnostic.CA1303.severity = none | ||
|
||
# SA1309: Field names should not begin with underscore | ||
dotnet_diagnostic.SA1309.severity = none | ||
|
||
# CA1062: Validate arguments of public methods | ||
dotnet_diagnostic.CA1062.severity = none | ||
|
||
# CA1031: Do not catch general exception types | ||
dotnet_diagnostic.CA1031.severity = none | ||
|
||
# CA5350: Do Not Use Weak Cryptographic Algorithms | ||
dotnet_diagnostic.CA5350.severity = none | ||
|
||
# SA1124: Do not use regions | ||
dotnet_diagnostic.SA1124.severity = none | ||
|
||
# SA1512: Single-line comments should not be followed by blank line | ||
dotnet_diagnostic.SA1512.severity = none | ||
|
||
# SA1127: Generic type constraints should be on their own line | ||
dotnet_diagnostic.SA1127.severity = none | ||
|
||
# SA1201: Elements should appear in the correct order | ||
dotnet_diagnostic.SA1201.severity = none | ||
|
||
# SA1202: Elements should be ordered by access | ||
dotnet_diagnostic.SA1202.severity = none | ||
|
||
# SA1133: Do not combine attributes | ||
dotnet_diagnostic.SA1133.severity = none | ||
|
||
# SA1611: Element parameters should be documented | ||
dotnet_diagnostic.SA1611.severity = silent | ||
|
||
# SA1633: File should have header | ||
dotnet_diagnostic.SA1633.severity = silent | ||
|
||
# SA1500: Braces for multi-line statements should not share line | ||
dotnet_diagnostic.SA1500.severity = none | ||
|
||
# RCS1169: Make field read-only. | ||
dotnet_diagnostic.RCS1169.severity = warning | ||
|
||
# CA1000: Do not declare static members on generic types | ||
dotnet_diagnostic.CA1000.severity = none | ||
|
||
# RCS1166: Value type object is never equal to null. | ||
dotnet_diagnostic.RCS1166.severity = error | ||
|
||
# CA1043: Use Integral Or String Argument For Indexers | ||
dotnet_diagnostic.CA1043.severity = none | ||
|
||
# SA1308: Variable names should not be prefixed | ||
dotnet_diagnostic.SA1308.severity = none | ||
|
||
# RCS1023: Format empty block. | ||
dotnet_diagnostic.RCS1023.severity = none | ||
|
||
# SA1502: Element should not be on a single line | ||
dotnet_diagnostic.SA1502.severity = none | ||
|
||
# SA1204: Static elements should appear before instance elements | ||
dotnet_diagnostic.SA1204.severity = none | ||
|
||
# SA1311: Static readonly fields should begin with upper-case letter | ||
dotnet_diagnostic.SA1311.severity = suggestion | ||
|
||
# CA1034: Nested types should not be visible | ||
dotnet_diagnostic.CA1034.severity = suggestion | ||
|
||
# CA2225: Operator overloads have named alternates | ||
dotnet_diagnostic.CA2225.severity = none | ||
|
||
# CS8600: Converting null literal or possible null value to non-nullable type. | ||
dotnet_diagnostic.CS8600.severity = none | ||
|
||
# SA1501: Statement should not be on a single line | ||
dotnet_diagnostic.SA1501.severity = none | ||
|
||
# RCS1096: Convert 'HasFlag' call to bitwise operation (or vice versa). | ||
dotnet_diagnostic.RCS1096.severity = none | ||
|
||
# SA1516: Elements should be separated by blank line | ||
dotnet_diagnostic.SA1516.severity = none | ||
|
||
# SA1205: Partial elements should declare access | ||
dotnet_diagnostic.SA1205.severity = none | ||
|
||
# CA1060: Move pinvokes to native methods class | ||
dotnet_diagnostic.CA1060.severity = none |
Oops, something went wrong.