I want to make a generic class that accepts only serializable classes, can it be done with the where constraint?
The concept I'm looking for is this:
public class MyClass<T> where T : //[is serializable/has the serializable attribute]
In C#, attributes are classes that inherit from the Attribute base class. Any class that inherits from Attribute can be used as a sort of "tag" on other pieces of code. For instance, there is an attribute called ObsoleteAttribute . This is used to signal that code is obsolete and shouldn't be used anymore.
The same you would normally check for an attribute on a class. Here's some sample code. typeof(ScheduleController) . IsDefined(typeof(SubControllerActionToViewDataAttribute), false);
Nope, I'm afraid not. The only things you can do with constraints are:
where T : class
- T must be a reference typewhere T : struct
- T must be a non-nullable value typewhere T : SomeClass
- T must be SomeClass or derive from itwhere T : ISomeInterface
- T must be ISomeInterface or implement itwhere T : new()
- T must have a public parameterless constructorVarious combinations are feasible, but not all. Nothing about attributes.
What I know; you can not do this. Have you though about adding an 'Initialize' method or something similar?
public void Initialize<T>(T obj) { object[] attributes = obj.GetType().GetCustomAttributes(typeof(SerializableAttribute)); if(attributes == null || attributes.Length == 0) throw new InvalidOperationException("The provided object is not serializable"); }
I haven't tested this code, but I hope that you get my point.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With