C# check for ref field custom attribute
I'd like to check for a field custom attribute of a field, that ref field is pointing to.
I have the following code example:
public void FieldSetter<T>(ref T field, T value, string fieldCategory)
{
GlobalDispatcher.NotifyBeforeChange(fieldCategory);
field = value;
GlobalDispatcher.NotifyAfterChange(fieldCategory);
if(true /* Check for field custom attribute*/)
GlobalDispatcher.NotifySpecialChange(fieldCategory);
}
And the following code usage:
[SpecialChange]
private int m_field1 = default(int);
public int Field1
{ get { return m_field1; } set { FieldSetter(ref m_field1, value, GlobalDispatcher.Ints); } }
[SpecialChange]
private string m_field2 = default(string);
public string Field2
{ get { return m_field2; } set { FieldSetter(ref m_field2, value, GlobalDispatcher.Strings); } }
I try to implement SpecialChangeAttribute.
I had following ideas just to make it work, but no solution solves all the cases:
- Iterate over class fields and use ReferenceEquals - not working with value types.
- Get field offset from Marshal and compare with field pointer - cant get the address of managed type T
Any ideas or tips?
c# c#-6.0
add a comment |
I'd like to check for a field custom attribute of a field, that ref field is pointing to.
I have the following code example:
public void FieldSetter<T>(ref T field, T value, string fieldCategory)
{
GlobalDispatcher.NotifyBeforeChange(fieldCategory);
field = value;
GlobalDispatcher.NotifyAfterChange(fieldCategory);
if(true /* Check for field custom attribute*/)
GlobalDispatcher.NotifySpecialChange(fieldCategory);
}
And the following code usage:
[SpecialChange]
private int m_field1 = default(int);
public int Field1
{ get { return m_field1; } set { FieldSetter(ref m_field1, value, GlobalDispatcher.Ints); } }
[SpecialChange]
private string m_field2 = default(string);
public string Field2
{ get { return m_field2; } set { FieldSetter(ref m_field2, value, GlobalDispatcher.Strings); } }
I try to implement SpecialChangeAttribute.
I had following ideas just to make it work, but no solution solves all the cases:
- Iterate over class fields and use ReferenceEquals - not working with value types.
- Get field offset from Marshal and compare with field pointer - cant get the address of managed type T
Any ideas or tips?
c# c#-6.0
You could check if it implements theIEquatable<>or theIComparableinterface
– J. van Langen
Nov 14 '18 at 11:10
Thanks for a response! Unfortunetly comparing variables doesnt seem to help with differentiation of two separate fields with the same value or Im missing something with this idea
– Kamil Kowalewski
Nov 14 '18 at 11:22
add a comment |
I'd like to check for a field custom attribute of a field, that ref field is pointing to.
I have the following code example:
public void FieldSetter<T>(ref T field, T value, string fieldCategory)
{
GlobalDispatcher.NotifyBeforeChange(fieldCategory);
field = value;
GlobalDispatcher.NotifyAfterChange(fieldCategory);
if(true /* Check for field custom attribute*/)
GlobalDispatcher.NotifySpecialChange(fieldCategory);
}
And the following code usage:
[SpecialChange]
private int m_field1 = default(int);
public int Field1
{ get { return m_field1; } set { FieldSetter(ref m_field1, value, GlobalDispatcher.Ints); } }
[SpecialChange]
private string m_field2 = default(string);
public string Field2
{ get { return m_field2; } set { FieldSetter(ref m_field2, value, GlobalDispatcher.Strings); } }
I try to implement SpecialChangeAttribute.
I had following ideas just to make it work, but no solution solves all the cases:
- Iterate over class fields and use ReferenceEquals - not working with value types.
- Get field offset from Marshal and compare with field pointer - cant get the address of managed type T
Any ideas or tips?
c# c#-6.0
I'd like to check for a field custom attribute of a field, that ref field is pointing to.
I have the following code example:
public void FieldSetter<T>(ref T field, T value, string fieldCategory)
{
GlobalDispatcher.NotifyBeforeChange(fieldCategory);
field = value;
GlobalDispatcher.NotifyAfterChange(fieldCategory);
if(true /* Check for field custom attribute*/)
GlobalDispatcher.NotifySpecialChange(fieldCategory);
}
And the following code usage:
[SpecialChange]
private int m_field1 = default(int);
public int Field1
{ get { return m_field1; } set { FieldSetter(ref m_field1, value, GlobalDispatcher.Ints); } }
[SpecialChange]
private string m_field2 = default(string);
public string Field2
{ get { return m_field2; } set { FieldSetter(ref m_field2, value, GlobalDispatcher.Strings); } }
I try to implement SpecialChangeAttribute.
I had following ideas just to make it work, but no solution solves all the cases:
- Iterate over class fields and use ReferenceEquals - not working with value types.
- Get field offset from Marshal and compare with field pointer - cant get the address of managed type T
Any ideas or tips?
c# c#-6.0
c# c#-6.0
asked Nov 14 '18 at 11:06
Kamil KowalewskiKamil Kowalewski
82
82
You could check if it implements theIEquatable<>or theIComparableinterface
– J. van Langen
Nov 14 '18 at 11:10
Thanks for a response! Unfortunetly comparing variables doesnt seem to help with differentiation of two separate fields with the same value or Im missing something with this idea
– Kamil Kowalewski
Nov 14 '18 at 11:22
add a comment |
You could check if it implements theIEquatable<>or theIComparableinterface
– J. van Langen
Nov 14 '18 at 11:10
Thanks for a response! Unfortunetly comparing variables doesnt seem to help with differentiation of two separate fields with the same value or Im missing something with this idea
– Kamil Kowalewski
Nov 14 '18 at 11:22
You could check if it implements the
IEquatable<> or the IComparable interface– J. van Langen
Nov 14 '18 at 11:10
You could check if it implements the
IEquatable<> or the IComparable interface– J. van Langen
Nov 14 '18 at 11:10
Thanks for a response! Unfortunetly comparing variables doesnt seem to help with differentiation of two separate fields with the same value or Im missing something with this idea
– Kamil Kowalewski
Nov 14 '18 at 11:22
Thanks for a response! Unfortunetly comparing variables doesnt seem to help with differentiation of two separate fields with the same value or Im missing something with this idea
– Kamil Kowalewski
Nov 14 '18 at 11:22
add a comment |
1 Answer
1
active
oldest
votes
I do not think you can get custom attributes for a field that you pass as ref. Reflection deals with static metadata about the code and what you get as parameter is changing from call to call.
What you can do is add additional parameter to your FieldSetter method that is an expression:
FieldSetter<T>(..., Expression<Func<T>> expression);
and call it like this:
FieldSetter(ref m_field2, value, GlobalDispatcher.Strings, ()=> m_field2);
This gives you lambda inside your method that you can inspect:
((MemberExpression)expression.Body).Member.GetCustomAttribute<SpecialChange>() != null
Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!
– Kamil Kowalewski
Nov 14 '18 at 11:32
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53298758%2fc-sharp-check-for-ref-field-custom-attribute%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I do not think you can get custom attributes for a field that you pass as ref. Reflection deals with static metadata about the code and what you get as parameter is changing from call to call.
What you can do is add additional parameter to your FieldSetter method that is an expression:
FieldSetter<T>(..., Expression<Func<T>> expression);
and call it like this:
FieldSetter(ref m_field2, value, GlobalDispatcher.Strings, ()=> m_field2);
This gives you lambda inside your method that you can inspect:
((MemberExpression)expression.Body).Member.GetCustomAttribute<SpecialChange>() != null
Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!
– Kamil Kowalewski
Nov 14 '18 at 11:32
add a comment |
I do not think you can get custom attributes for a field that you pass as ref. Reflection deals with static metadata about the code and what you get as parameter is changing from call to call.
What you can do is add additional parameter to your FieldSetter method that is an expression:
FieldSetter<T>(..., Expression<Func<T>> expression);
and call it like this:
FieldSetter(ref m_field2, value, GlobalDispatcher.Strings, ()=> m_field2);
This gives you lambda inside your method that you can inspect:
((MemberExpression)expression.Body).Member.GetCustomAttribute<SpecialChange>() != null
Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!
– Kamil Kowalewski
Nov 14 '18 at 11:32
add a comment |
I do not think you can get custom attributes for a field that you pass as ref. Reflection deals with static metadata about the code and what you get as parameter is changing from call to call.
What you can do is add additional parameter to your FieldSetter method that is an expression:
FieldSetter<T>(..., Expression<Func<T>> expression);
and call it like this:
FieldSetter(ref m_field2, value, GlobalDispatcher.Strings, ()=> m_field2);
This gives you lambda inside your method that you can inspect:
((MemberExpression)expression.Body).Member.GetCustomAttribute<SpecialChange>() != null
I do not think you can get custom attributes for a field that you pass as ref. Reflection deals with static metadata about the code and what you get as parameter is changing from call to call.
What you can do is add additional parameter to your FieldSetter method that is an expression:
FieldSetter<T>(..., Expression<Func<T>> expression);
and call it like this:
FieldSetter(ref m_field2, value, GlobalDispatcher.Strings, ()=> m_field2);
This gives you lambda inside your method that you can inspect:
((MemberExpression)expression.Body).Member.GetCustomAttribute<SpecialChange>() != null
answered Nov 14 '18 at 11:20
RafalRafal
9,7022345
9,7022345
Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!
– Kamil Kowalewski
Nov 14 '18 at 11:32
add a comment |
Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!
– Kamil Kowalewski
Nov 14 '18 at 11:32
Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!
– Kamil Kowalewski
Nov 14 '18 at 11:32
Thank you for your solution! It requires some global changes, but probably is the only one that would work! Thanks!
– Kamil Kowalewski
Nov 14 '18 at 11:32
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53298758%2fc-sharp-check-for-ref-field-custom-attribute%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
You could check if it implements the
IEquatable<>or theIComparableinterface– J. van Langen
Nov 14 '18 at 11:10
Thanks for a response! Unfortunetly comparing variables doesnt seem to help with differentiation of two separate fields with the same value or Im missing something with this idea
– Kamil Kowalewski
Nov 14 '18 at 11:22