ValidSymbol¶
A validated symbol where the underlying value is guaranteed non-null. Created by validating an OptionalSymbol.
See also: Projections Overview | OptionalSymbol
Creating¶
ValidSymbol<INamedTypeSymbol>.From(typeSymbol) // throws if null
ValidSymbol<INamedTypeSymbol>.TryFrom(typeSymbol) // returns null if input is null
// From OptionalSymbol validation (preferred)
if (optional.IsValid(out var valid)) { /* use valid */ }
Properties¶
Same properties as OptionalSymbol, but return non-nullable types:
valid.Value // TSymbol — the underlying symbol (guaranteed non-null)
valid.Name // string (not nullable)
valid.FullyQualifiedName // string (not nullable)
valid.Accessibility // Accessibility (not nullable)
Additional Task Properties¶
valid.IsValueTask // bool
valid.IsGenericTask // bool — Task<T>
valid.IsGenericValueTask // bool — ValueTask<T>
valid.IsNonGenericTask // bool — Task (no type argument)
valid.IsNonGenericValueTask // bool — ValueTask (no type argument)
Transforming¶
TResult result = valid.Map(s => s.Name);
ValidSymbol<IMethodSymbol> method = valid.MapTo(s => (IMethodSymbol)s);
ValidSymbol<T>? filtered = valid.Where(s => s.IsPublic);
ValidSymbol<IMethodSymbol>? method = valid.OfType<IMethodSymbol>();
valid.Do(s => Console.WriteLine(s.Name));
Attribute Access¶
// Get all attributes
valid.GetAttributes() // IEnumerable<ValidAttribute>
// Get by name (supports "Name" or "NameAttribute")
valid.GetAttributes("Obsolete") // IEnumerable<ValidAttribute>
valid.GetAttribute("Obsolete") // OptionalAttribute
// Get by generic type parameter
valid.GetAttributes<ObsoleteAttribute>() // IEnumerable<ValidAttribute>
valid.GetAttribute<ObsoleteAttribute>() // OptionalAttribute
// Get by System.Type (supports open generics for finding any instantiation)
valid.GetAttributes(typeof(MyGenericAttribute<>)) // IEnumerable<ValidAttribute>
valid.GetAttribute(typeof(MyGenericAttribute<>)) // OptionalAttribute
// Check presence
valid.HasAttribute("Obsolete") // bool
valid.HasAttribute<ObsoleteAttribute>() // bool
valid.HasAttribute(typeof(MyGenericAttribute<>)) // bool
valid.LacksAttribute("Obsolete") // bool
Finding Generic Attributes¶
For generic attributes like [HttpClient<TConfig>], use Type overloads or metadata name:
// Using Type with open generic
var attrs = symbol.GetAttributes(typeof(HttpClientAttribute<>));
// Using metadata name with arity
var attrs = symbol.Value.GetAttributesByMetadataName("HttpClientAttribute`1");
Type Hierarchy (INamedTypeSymbol)¶
valid.BaseType // OptionalSymbol<INamedTypeSymbol>
valid.GetBaseTypes() // IEnumerable<ValidSymbol<INamedTypeSymbol>>
valid.GetInterfaces() // IEnumerable<ValidSymbol<INamedTypeSymbol>>
valid.GetAllInterfaces() // IEnumerable<ValidSymbol<INamedTypeSymbol>>
valid.ImplementsInterface("IDisposable") // bool
valid.InheritsFrom("BaseClass") // bool