C
C#3mo ago
Lounder

How terrible is this Result implementation?

public class SuccessResult : Result
{
public object? Data { get; protected set; }

internal SuccessResult(int statusCode, object? data)
: base(statusCode, true)
{
this.Data = data;
}
}

public class SuccessResult<T> : SuccessResult
{
public new T? Data
{
get => (T?)base.Data;
private set => base.Data = value;
}

internal SuccessResult(int statusCode, T? data)
: base(statusCode, data)
{
}
}
public class SuccessResult : Result
{
public object? Data { get; protected set; }

internal SuccessResult(int statusCode, object? data)
: base(statusCode, true)
{
this.Data = data;
}
}

public class SuccessResult<T> : SuccessResult
{
public new T? Data
{
get => (T?)base.Data;
private set => base.Data = value;
}

internal SuccessResult(int statusCode, T? data)
: base(statusCode, data)
{
}
}
5 Replies
Lounder
LounderOP3mo ago
Is it absolutely wrong to do it like so? I'll be using this instead
public class SuccessResult<T> : Result, ISuccessResult
{
public object? DataObject => this.Data;

public T? Data { get; private set; }

internal SuccessResult(int statusCode, T? data)
: base(statusCode, true)
{
this.Data = data;
}
}
public class SuccessResult<T> : Result, ISuccessResult
{
public object? DataObject => this.Data;

public T? Data { get; private set; }

internal SuccessResult(int statusCode, T? data)
: base(statusCode, true)
{
this.Data = data;
}
}
Sossenbinder
Sossenbinder3mo ago
The first version is definitely not ideal, you have a shadowed property, and this would also be prone to boxing in case T is a value type Second option definitely looks better Although I'm not sure when you would need an object as the Data opposed to the T itself There's a bunch of result implementations out there you can just use as well
Lounder
LounderOP3mo ago
public static ActionResult ToActionResult(this Result result)
{
var httpCodes = Enum.GetValues(typeof(HttpStatusCode)).Cast<int>();

int? httpStatusCode = httpCodes.Contains(result.StatusCode) ? result.StatusCode : null;

if (result is ISuccessResult successResult)
{
object injectedObject = InjectAppStatusInObject(successResult.DataObject, successResult.StatusCode);

return new JsonResult(injectedObject)
{
StatusCode = httpStatusCode ?? (int)HttpStatusCode.OK
};
}
...
public static ActionResult ToActionResult(this Result result)
{
var httpCodes = Enum.GetValues(typeof(HttpStatusCode)).Cast<int>();

int? httpStatusCode = httpCodes.Contains(result.StatusCode) ? result.StatusCode : null;

if (result is ISuccessResult successResult)
{
object injectedObject = InjectAppStatusInObject(successResult.DataObject, successResult.StatusCode);

return new JsonResult(injectedObject)
{
StatusCode = httpStatusCode ?? (int)HttpStatusCode.OK
};
}
...
I need the object so I can return the Data itself In this result.ToActionResult() method, I dont know <T>
Sossenbinder
Sossenbinder3mo ago
But you could create an extension method on Result<T>, transforming it into an ActionResult<T>
Lounder
LounderOP3mo ago
Honestly I just scrapped the whole thing hahahah Im just using a very barebones result right now I will rework it later on

Did you find this page helpful?