Skip to content

Instantly share code, notes, and snippets.

View adlerpagliarini's full-sized avatar

Adler Pagliarini adlerpagliarini

View GitHub Profile
public enum UserTypes
{
STANDARD,
PREMIUM,
DIAMOND
}
public class User
{
public string Name { get; set; }
public UserTypes Type { get; set; }
}
public abstract class DiscountRate
{
protected abstract double PercentOfDiscountRate { get; }
public abstract double CalculateDiscount(double value);
}
public sealed class Standard : DiscountRate
{
protected override double PercentOfDiscountRate { get => 0.0; }
public override double CalculateDiscount(double value)
{
return value * PercentOfDiscountRate;
}
}
public sealed class Premium : DiscountRate
public class PurchaseOrder
{
public double Value { get; set; }
public User User { get; set; }
private DiscountRate _discountRate { get; set; }
public double CalculateOrderPrice()
{
if (User.Type == UserTypes.STANDARD)
public class User
{
....
public DiscountRate GetDiscountRate()
{
if (Type == UserTypes.STANDARD)
return new Standard();
else if (Type == UserTypes.PREMIUM)
return new Premium();
else if (Type == UserTypes.DIAMOND)
public class UserTypeAttribute : Attribute
{
private Type _implementation { get; }
public DiscountRate CreateInstance => (DiscountRate) Activator.CreateInstance(_implementation);
public UserTypeAttribute(Type implementation)
{
_implementation = implementation;
}
public enum UserTypes
{
[UserTypeAttribute(typeof(Standard))]
STANDARD,
[UserTypeAttribute(typeof(Premium))]
PREMIUM,
[UserTypeAttribute(typeof(Diamond))]
DIAMOND
}
public static class UserTypesExtensionMethods
{
public static DiscountRate GetDiscountRateImplementation(this Enum userType)
{
....
}
}
public static class UserTypesExtensionMethods
{
public static DiscountRate GetDiscountRateImplementation(this Enum userType)
{
var attribute = typeof(UserTypes).GetFields()
.Where(f => f.Name == userType.ToString())
.FirstOrDefault()
?.GetCustomAttributes(false).First() as UserTypeAttribute;
if (attribute != null)