ਰਿਫਲੈਕਸ਼ਨ ਇੱਕ ਪ੍ਰੋਗ੍ਰਾਮ ਨੂੰ ਰਨਟਾਈਮ ਉੱਤੇ ਟਾਈਪਸ, ਮੈਥਡਸ, ਅਤੇ ਪ੍ਰਾਪਰਟੀਜ਼ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਹੇਰਾ-ਫੇਰੀ ਕਰਨ ਦਿੰਦਾ ਹੈ — ਇੱਥੋ ਦੀ ਆ ਜੇ ਕਂਪਾਇਲ ਟਾਈਮ ਉੱਤੇ ਪਤਾ ਨਾ ਹੋਣ। ਐਟ੍ਰਿਬਿਊਟਸ ਕੋਡ ਨੂੰ ਡਿਕਲੇਰੇਟਿਵ ਮੈਟਾਡੇਟਾ ਨਾਲ ਜੋਰ ਦਿੰਦੇ ਹਨ ਜੋ ਟੂਲਸ ਅਤੇ ਫ੍ਰੇਮਵਰਕਸ (ਅਕਸਰ ਰਿਫਲੈਕਸ਼ਨ ਦੁਆਰਾ) ਪੜ੍ਹਦੇ ਹਨ ਤਾਂ ਜੋ ਵਿਵਹਾਰ ਚਲਾਇਆ ਜਾ ਸਕੇ। ਇਕੱਠੇ ਉਹ .NET ਦੀ ਬਹੁਤ ਸਾਰੀ ਫ੍ਰੇਮਵਰਕ "ਜਾਦੂ" ਨੂੰ ਸ਼ਕਤੀ ਪ੍ਰਦਾਨ ਕਰਦੇ ਹਨ (ਸੀਰੀਅਲਾਈਜ਼ੇਸ਼ਨ, ਡੀਆਈ, ਓਆਰਮਜ਼, ਵੈਲੀਡੇਸ਼ਨ)।
ਰਿਫਲੈਕਸ਼ਨ — ਰਨਟਾਈਮ ਨਿਰੀਖਣ ਅਤੇ ਇਨਵੋਕੇਸ਼ਨ
// examine a type's structure at runtime
Type type = typeof(User);
foreach (PropertyInfo prop in type.GetProperties())
Console.WriteLine($"{prop.Name}: {prop.PropertyType}");
foreach (MethodInfo method in type.GetMethods()) { }
// create instances and invoke members dynamically
object instance = Activator.CreateInstance(type); // create without knowing the type at compile time
PropertyInfo p = type.GetProperty("Name");
p.SetValue(instance, "Ann"); // set a property reflectively
ਰਿਫਲੈਕਸ਼ਨ ਕੋਡ ਨੂੰ ਟਾਈਪਸ ਨੂੰ ਗਤੀਸ਼ੀਲ ਤੌਰ ਤੇ ਖੋਜਣ ਅਤੇ ਵਰਤਣ ਦਿੰਦਾ ਹੈ — ਟਾਈਪ ਦੁਆਰਾ ਸ਼ੋ ਕਰਨਾ, ਪ੍ਰਾਪਰਟੀਜ਼ ਪੜ੍ਹਨਾ/ਸੈਟ ਕਰਨਾ, ਮੈਥਡਸ ਇਨਵੋਕ ਕਰਨਾ — ਜੋ ਕਿ ਹੈ ਕਿ ਕਿਵੇਂ ਫ੍ਰੇਮਵਰਕਸ ਤੁਹਾਡੇ ਟਾਈਪਸ ਉੱਤੇ ਬਿਨਾਂ ਇਹ ਅਨ੍ਹਾਂ ਨੂੰ ਅਗਿਆ ਕੰਮ ਕਰਦੇ ਹਨ।
ਐਟ੍ਰਿਬਿਊਟਸ — ਡਿਕਲੇਰੇਟਿਵ ਮੈਟਾਡੇਟਾ
// built-in and framework attributes attach metadata to code
[Obsolete("Use NewMethod instead")]
[Serializable]
public class OldClass { }
public class User
{
[Required] // validation attribute (ASP.NET)
[StringLength(100)]
public string Name { get; set; }
[JsonPropertyName("email_address")] // serialization attribute
public string Email { get; set; }
}
[HttpGet("/users/{id}")] // ASP.NET routing attribute
public User Get(int id) { }
ਐਟ੍ਰਿਬਿਊਟਸ ਕੋਡ ਨੂੰ ਮੈਟਾਡੇਟਾ ਨਾਲ ਨੋਟ ਕਰਦੇ ਹਨ ਜੋ ਫ੍ਰੇਮਵਰਕਸ ਵਿਵਹਾਰ ਚਲਾਉਣ ਲਈ ਪੜ੍ਹਦੇ ਹਨ — ਵੈਲੀਡੇਸ਼ਨ ਰੂਲਸ, ਸੀਰੀਅਲਾਈਜ਼ੇਸ਼ਨ ਨਾਮ, ਰਾਊਟਿੰਗ, ਆਦਿ।
ਕਸਟਮ ਐਟ੍ਰਿਬਿਊਟਸ + ਰਿਫਲੈਕਸ਼ਨ (ਫ੍ਰੇਮਵਰਕਸ ਕਿਵੇਂ ਕੰਮ ਕਰਦੇ ਹਨ)
public class AuditAttribute : Attribute { public string Action; }
[Audit(Action = "delete")]
public void DeleteUser(int id) { }
// a framework reads the attribute via reflection and acts on it
var attr = method.GetCustomAttribute<AuditAttribute>();
if (attr != null) Log(attr.Action); // wrap/log/intercept based on the metadata
ਇਹ ਮਕੇਨਿਜ਼ਮ ਏ.ਐੱਸ.ਪੀ.ਨੈੱਟ ([HttpGet], [Authorize]), ਵੈਲੀਡੇਸ਼ਨ ([Required]), ਸੀਰੀਅਲਾਈਜ਼ੇਸ਼ਨ ([JsonPropertyName]), ਓਆਰਮਜ਼, ਅਤੇ ਟੈਸਟਿੰਗ ਫ੍ਰੇਮਵਰਕਸ ਦੇ ਪਿੱਛੇ ਹੈ — ਉਹ ਰਿਫਲੈਕਸ਼ਨ ਦੁਆਰਾ ਐਟ੍ਰਿਬਿਊਟਡ ਕੋਡ ਨੂੰ ਸਕੈਨ ਕਰਦੇ ਹਨ ਅਤੇ ਵਿਵਹਾਰ ਨੂੰ ਤਾਰ ਕਰਦੇ ਹਨ।
ਇਹ ਮਹੱਤਵਪੂਰਨ ਕਿਉਂ ਹੈ
ਰਿਫਲੈਕਸ਼ਨ ਅਤੇ ਐਟ੍ਰਿਬਿਊਟਸ .NET ਦੀ ਬਹੁਤ ਸਾਰੀ ਫ੍ਰੇਮਵਰਕ ਕਾਰਜ ਪ੍ਰਣਾਲੀ ਦੇ ਮਸ਼ਨਰੀ ਹਨ, ਇਸ ਲਈ ਉਨ੍ਹਾਂ ਨੂੰ ਸਮਝਣਾ ਫ੍ਰੇਮਵਰਕਸ ਕਿਵੇਂ ਕੰਮ ਕਰਦੇ ਹਨ ਇਸ ਨੂੰ ਸਮਝਣ ਅਤੇ ਉੱਨਤ ਸਥਿਤੀਆਂ ਲਈ ਮਾਨਯੋਗ ਹੈ। ਰਿਫਲੈਕਸ਼ਨ ਜੈਨਰਿਕ, ਗਤੀਸ਼ੀਲ ਵਿਵਹਾਰ ਨੂੰ ਸਮਰਥ ਬਣਾਉਂਦਾ ਹੈ — ਰਨਟਾਈਮ ਉੱਤੇ ਟਾਈਪਸ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਕੰਮ ਬਿਨਾਂ ਕਂਪਾਇਲ-ਟਾਈਮ ਗਿਆਨ — ਜੋ ਕਿ ਹੈ ਕਿ ਡੀਪੀ ਇਨਜੈਕਸ਼ਨ, ਸੀਰੀਅਲਾਈਜ਼ੇਸ਼ਨ (JSON/XML ਲਾਇਬ੍ਰੇਰੀਜ਼ ਪੜ੍ਹਣ ਵਾਲੀਆਂ ਪ੍ਰਾਪਰਟੀਜ਼), ਓਆਰਮਜ਼ (ਆਬਜੈਕਟਸ ਨੂੰ ਡਾਟਾਬੇਸ ਟੇਬਲਸ ਵਿੱਚ ਮੈਪ ਕਰਨਾ), ਅਤੇ ਤੁਹਾਡੀ ਆਰਬਾਇਟ੍ਰੇਰੀ ਟਾਈਪਸ ਉੱਤੇ ਕੰਮ ਕਰਨ ਵਾਲੀਆਂ ਟੈਸਟਿੰਗ ਫ੍ਰੇਮਵਰਕਸ ਕੰਮ ਕਰਦੀਆਂ ਹਨ। ਐਟ੍ਰਿਬਿਊਟਸ ਡਿਕਲੇਰੇਟਿਵ ਮੈਟਾਡੇਟਾ ਪ੍ਰਦਾਨ ਕਰਦੇ ਹਨ ਇਹ ਟੂਲਸ (ਰਿਫਲੈਕਸ਼ਨ ਦੁਆਰਾ) ਪੜ੍ਹਦੇ ਹਨ ਆਪਣਾ ਵਿਵਹਾਰ ਚਲਾਉਣ ਲਈ, ਵਰਬੋਜ਼ ਕਾਨਫਿਗਰੇਸ਼ਨ ਦੀ ਥਾਂ ਸਧਾਰਨ ਐਨੋਟੇਸ਼ਨਸ ਦੇ ਨਾਲ ([Required] ਵੈਲੀਡੇਸ਼ਨ ਲਈ, [HttpGet] ਰਾਊਟਿੰਗ ਲਈ, [JsonPropertyName] ਸੀਰੀਅਲਾਈਜ਼ੇਸ਼ਨ ਲਈ, [Authorize] ਸਿੱਖਿਆ ਲਈ)।
ਉਨ੍ਹਾਂ ਨੂੰ ਸਮਝਣਾ ਏ.ਐੱਸ.ਪੀ.ਨੈੱਟ ਕੋਰ, ਐਨਟਿਟੀ ਫ੍ਰੇਮਵਰਕ, ਵੈਲੀਡੇਸ਼ਨ, ਸੀਰੀਅਲਾਈਜ਼ੇਸ਼ਨ, ਅਤੇ ਟੈਸਟਿੰਗ ਫ੍ਰੇਮਵਰਕਸ ਦੀ ਡਿਕਲੇਰੇਟਿਵ "ਜਾਦੂ" ਨੂੰ ਕਿਵੇਂ ਪ੍ਰਾਪਤ ਕਰਦੇ ਹਨ ਇਸ ਨੂੰ ਰਹਸ ਖੋਲ੍ਹਦਾ ਹੈ — ਇਹ ਦੇਖਦੇ ਹਾਂ ਕਿ ਐਟ੍ਰਿਬਿਊਟਸ ਕੋਡ ਨੂੰ ਨਿਸ਼ਾਨ ਲਗਾਉਂਦੇ ਹਨ ਅਤੇ ਰਿਫਲੈਕਸ਼ਨ ਆ ਨੂੰ ਪੜ੍ਹਦਾ ਹੈ ਅਤੇ ਅਉਂ ਉੱਤੇ ਕੰਮ ਕਰਦਾ ਹੈ।
ਇਹ ਗਿਆਨ ਇਹਨਾਂ ਫ੍ਰੇਮਵਰਕਸ ਨੂੰ ਪ੍ਰਭਾਵੀ ਢੰਗ ਨਾਲ ਵਰਤਣ ਲਈ, ਆਪਣੇ ਆਪ ਦੇ ਫ੍ਰੇਮਵਰਕ-ਮਾਨਰ ਪੋਲ ਜਾਂ ਲਾਇਬ੍ਰੇਰੀਜ਼ ਬਣਾਉਣ ਲਈ (ਕਸਟਮ ਐਟ੍ਰਿਬਿਊਟਸ + ਰਿਫਲੈਕਸ਼ਨ), ਅਤੇ ਵਪਾਰ-ਆਫਸ ਨੂੰ ਸਮਝਣ ਲਈ (ਰਿਫਲੈਕਸ਼ਨ ਸਿੱਧੇ ਕਾਲਸ ਨਾਲੋਂ ਹੌਲਾ ਹੈ ਅਤੇ ਕੁਝ ਕੰਪਾਇਲ-ਟਾਈਮ ਚੈਕ ਨੂੰ ਬਾਈਪਾਸ ਕਰਦਾ ਹੈ, ਇਸ ਲਈ ਸਾਵਧਾਨੀ ਨਾਲ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ) ਮਾਨਯੋਗ ਹੈ।
ਜਦੋਂ ਉੱਨਤ ਅਤੇ ਹਰ ਰੋਜ਼ ਕੋਡਿੰਗ ਨਹੀਂ ਹੈ, ਰਿਫਲੈਕਸ਼ਨ ਅਤੇ ਐਟ੍ਰਿਬਿਊਟਸ ਨੂੰ ਸਮਝਣਾ .NET ਪ੍ਰਿਸਥਾਤਕ ਵਿੱਚ ਗਰੀਮ-ਸਤਰੀ ਗਿਆਨ ਹੈ — ਇਹ ਵਿਆਖਿਆ ਕਿ ਫ੍ਰੇਮਵਰਕਸ ਜੋ ਤੁਸੀਂ ਰੋਜ਼ ਵਰਤਦੇ ਹੋ ਅਸਲ ਵਿੱਚ ਕਾਂ ਕਿਵੇਂ ਕੰਮ ਕਰਦੇ ਹਨ, ਉੱਨਤ ਮੈਟਾਪ੍ਰੋਗ੍ਰਾਮਿੰਗ ਨੂੰ ਸਮਰਥ ਬਣਾਉਂਦਾ ਹੈ, ਅਤੇ .NET ਆਰਕਿਟੈਕਚਰ ਨੂੰ ਸਮਝਣ ਅਤੇ ਐਟ੍ਰਿਬਿਊਟ-ਚਲਿਤ ਲਾਇਬ੍ਰੇਰੀਜ਼ ਬਣਾਉਣ ਲਈ ਇੱਕ ਢੁਕਵਾਂ ਵਿਸ਼ੇ ਹੈ, ਇਸਨੂੰ ਗਿਆਨ ਕਰ ਦੇਵਾਲੀ ਹੈ ਜੋ ਡਿਵੈਲਪਰਸ ਦੇ ਡੂਝ .NET ਅਤੇਰਫੋ ਵਿਧਾ ਦੇ ਨਾਲ ਨਿਰੱਤ ਕਰਦਾ ਹੈ।
